[SQL注入][Advanced injection]sqli-labs学习记录(23-37关)

学习记录

  • 前置知识
    • 二次排序注入思路
    • 服务器架构(以靶场为例)
    • 宽字节注入
  • 第23关 ------ 注释符号过滤
  • 第24关 ------ 二次注入
  • 第25关 ------ or与and过滤
  • 第25a关 ------ or与and过滤
  • 第26关 ------ 注释and与or与空格
  • 第26a关 ------ 不使用报错注入
  • 第27关 ----- 大小写或双写绕过
  • 第27a关 ------ 稍微加强了过滤规则
  • 第28关 ------ 同27关没区别
  • 第28a关 ------ 第28关简化版(没意义)
  • 第29关 ------ 啥玩意儿?
  • 第30关 ------ HPP
  • 第31关 ------ HPP
  • 第32关 ------ 宽字节注入
  • 第33关 ------ 宽字节注入
    • 防御此漏洞
  • 第34关 ------ 转utf16绕过
  • 第35关 ------ 迷惑关卡
  • 第36关 ------ escape_string
  • 第37关 ------ 34关+POST型
  • 参考文章

前置知识

二次排序注入思路

1.黑客通过构造数据的形式,在浏览器或者其他软件中提交 HTTP 数据报文请求到服务 端进行处理,提交的数据报文请求中可能包含了黑客构造的 SQL 语句或者命令
2.服务端应用程序会将黑客提交的数据信息进行存储,通常是保存在数据库中,保存的 数据信息的主要作用是为应用程序执行其他功能提供原始输入数据并对客户端请求做出响应
3.黑客向服务端发送第二个与第一次不相同的请求数据信息
4.服务端接收到黑客提交的第二个请求信息后,为了处理该请求,服务端会查询数据库 中已经存储的数据信息并处理,从而导致黑客在第一次请求中构造的 SQL 语句或者命令在服 务端环境中执行
5.服务端返回执行的处理结果数据信息,黑客可以通过返回的结果数据信息判断二次注入漏洞利用是否成功。

服务器架构(以靶场为例)

服务器端有两个部分:第一部分为 tomcat 为引擎的 jsp 型服务器,第二部分为 apache为引擎的 php 服务器,真正提供 web 服务的是 php 服务器。工作流程为:client 访问服务器, 能直接访问到 tomcat 服务器,然后 tomcat 服务器再向 apache 服务器请求数据。数据返回 路径则相反
重点:index.php?id=1&id=2,你猜猜到底是显示 id=1 的数据还是显示 id=2 的?
说明注释:apache(php)解析最后一个参数,即显示 id=2 的内容。Tomcat(jsp)解析第 一个参数,即显示 id=1 的内容。
[SQL注入][Advanced injection]sqli-labs学习记录(23-37关)_第1张图片
此处我们想一个问题:index.jsp?id=1&id=2 请求,针对第一张图中的服务器配置情况, 客户端请求首先过 tomcat,tomcat 解析第一个参数,接下来 tomcat 去请求 apache(php) 服务器,apache 解析最后一个参数。那最终返回客户端的应该是哪个参数?
针对29关此处应该是 id=2 的内容,因为实际上为我们提供服务的是 apache(php)服务器, 返回的数据也应该是 apache 处理的数据。而在我们实际应用中,也是有两层服务器的情况, 那为什么要这么做?是因为我们往往在 tomcat 服务器处做数据过滤和处理,功能类似为一 个 WAF。而正因为解析参数的不同,我们此处可以利用该原理绕过 WAF 的检测。该用法就 是 HPP(HTTP Parameter Pollution),http参数污染攻击的一个应用;

宽字节注入

原理:mysql 在使用 GBK 编码的时候,会认为两个字符为一个汉字,例如%aa%5c 就是一个 汉字(前一个 ascii 码大于 128 才能到汉字的范围)。我们在过滤 ’ 的时候,往往利用的思 路是将 ‘ 转换为 \’ (转换的函数或者思路会在每一关遇到的时候介绍)。 因此我们在此想办法将 ‘ 前面添加的 \ 除掉,一般有两种思路:

  • 1、%df 吃掉 \ 具体的原因是 urlencode(‘) = %5c%27,我们在%5c%27 前面添加%df,形 成%df%5c%27,而上面提到的 mysql 在 GBK 编码方式的时候会将两个字节当做一个汉字,此 事%df%5c 就是一个汉字,%27 则作为一个单独的符号在外面,同时也就达到了我们的目的。
  • 2、将 \’ 中的 \ 过滤掉,例如可以构造 %**%5c%5c%27 的情况,后面的%5c 会被前面的%5c 给注释掉。这也是 bypass 的一种方法。

第23关 ------ 注释符号过滤

现在水平也不高,做不出来,虽然不能直接去看别人的WP,但是看下源码思考下,就当训练代码审计,发现注释符号被注释了QAQ
[SQL注入][Advanced injection]sqli-labs学习记录(23-37关)_第2张图片
再看$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";sql注入的语句,那么现在能走的路应该就是闭合的方式了
没问题哈,那这道题也算做完了,后面查表太简单了
[SQL注入][Advanced injection]sqli-labs学习记录(23-37关)_第3张图片

第24关 ------ 二次注入

我们注册一个名为admin'#的用户,之后登录这个账户,并修改密码,最终改掉的密码其实是admin的密码
因为一开始sql语句是这样的
$sql = "UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass' ";
此例子中我们的步骤是注册一个 admin’#的账号,接下来登录该帐号后进行修改密码。此时Sql 语句变为 UPDATE users SET passwd="New_Pass" WHERE username =' admin' # ' AND password=', 也 就 是 执 行 了 UPDATE users SET passwd="New_Pass" WHERE username =' admin'
看登录成功了哈哈哈
[SQL注入][Advanced injection]sqli-labs学习记录(23-37关)_第4张图片

第25关 ------ or与and过滤

如何绕过 or 和 and 过滤。一般性提供以下几种思路:
(1)大小写变形 Or,OR,oR
(2)编码,hex,urlencode
(3)添加注释/*or*/
(4)利用符号 and=&& or=||
如何解决这道题可以使用时间盲注或者报错注入,我懒,直接报错注入吧
[SQL注入][Advanced injection]sqli-labs学习记录(23-37关)_第5张图片

第25a关 ------ or与and过滤

这关不输出报错信息了,考虑延时盲注或者联合查询吧

联合查询没毛病
[SQL注入][Advanced injection]sqli-labs学习记录(23-37关)_第6张图片
延时也没问题,ok这道题解决了哦
[SQL注入][Advanced injection]sqli-labs学习记录(23-37关)_第7张图片

第26关 ------ 注释and与or与空格

本关结合 25 关,将空格,or,and,/*,#,–,/等各种符号过滤,此处对于 and,or 的处理方 法不再赘述,参考 25.此处我们需要说明两方面:对于注释和结尾字符的我们此处只能利用 构造一个 ’ 来闭合后面到 ’ ;
对于空格,有较多的方法:
%09 TAB 键(水平)
%0a 新建一行
%0c 新的一页
%0d return 功能
%0b TAB 键(垂直
%a0 空格
括号()
/**/
没问题,很完美,当然报错注入、延时注入也很OK,懒得写了
[SQL注入][Advanced injection]sqli-labs学习记录(23-37关)_第8张图片

第26a关 ------ 不使用报错注入

这关与 26 的区别在于,sql 语句添加了一个括号,同时在 sql 语句执行抛出错误后并 不在前台页面输出。所有我们排除报错注入,这里依旧是利用 union 注入
sql 语句为 SELECT * FROM users WHERE id=(’$id’) LIMIT 0,1
因此我们构造payload')union%a0select%a01,2,('3,这样一方面满足了绕过,另一方面也补齐全了union select的需要三个参数[SQL注入][Advanced injection]sqli-labs学习记录(23-37关)_第9张图片

第27关 ----- 大小写或双写绕过

从源码不难发现,没有区分大小写,因此我们只需要稍微改一下上面参数
[SQL注入][Advanced injection]sqli-labs学习记录(23-37关)_第10张图片
很完美就绕过了,没啥难度
[SQL注入][Advanced injection]sqli-labs学习记录(23-37关)_第11张图片
此外uniunionon 也是可以突破限制的。亦可以利用报错注入和延时注入的语法进行注入。

第27a关 ------ 稍微加强了过滤规则

[SQL注入][Advanced injection]sqli-labs学习记录(23-37关)_第12张图片

第28关 ------ 同27关没区别

[SQL注入][Advanced injection]sqli-labs学习记录(23-37关)_第13张图片

第28a关 ------ 第28关简化版(没意义)

[SQL注入][Advanced injection]sqli-labs学习记录(23-37关)_第14张图片

第29关 ------ 啥玩意儿?

比前面的题都简单无数倍,没搞懂啥意思(后面懂了HTTP参数污染攻击,他单纯模仿了这个函数,虽然没作用)
[SQL注入][Advanced injection]sqli-labs学习记录(23-37关)_第15张图片

看下源码呢,看看也没有啥高级操作,一脸蒙蔽不知道出题人这道题意图是撒谎,估计是为下一题提示?
[SQL注入][Advanced injection]sqli-labs学习记录(23-37关)_第16张图片

第30关 ------ HPP

这道题有点小坑的地方就是不输出出错函数,因此也无法用order by去判断列数,只能直接union select来通过输出判断有三列[SQL注入][Advanced injection]sqli-labs学习记录(23-37关)_第17张图片
下面就是打组合拳的事情了,没啥难度
[SQL注入][Advanced injection]sqli-labs学习记录(23-37关)_第18张图片

第31关 ------ HPP

换了个构造方式而已,没有啥多余的操作,这是sql语句
[SQL注入][Advanced injection]sqli-labs学习记录(23-37关)_第19张图片

[SQL注入][Advanced injection]sqli-labs学习记录(23-37关)_第20张图片

第32关 ------ 宽字节注入

[SQL注入][Advanced injection]sqli-labs学习记录(23-37关)_第21张图片
上述函数为过滤 ‘ \ 的函数,将 ‘ 转为 \’ , 将 \ 转为 \ ,将 “ 转为 \”。因此 此处我们只能考虑 background 中的第一个思路,添加一个%df 后,将%5c 消除即可,因此可以构造payload
[SQL注入][Advanced injection]sqli-labs学习记录(23-37关)_第22张图片

第33关 ------ 宽字节注入

这一关和上一关不同,使用内置函数
[SQL注入][Advanced injection]sqli-labs学习记录(23-37关)_第23张图片
addslashes() 函数返回在预定义字符之前添加反斜杠的字符串。该函数可用于为存储在数据库中的字符串以及数据库查询语句准备字符串。

预定义字符是:

  • 单引号(’)
  • 双引号(")
  • 反斜杠(\)

Addslashes()函数和我们在 32 关实现的功能基本一致的,所以我们依旧可以利用%df 进行绕过。
[SQL注入][Advanced injection]sqli-labs学习记录(23-37关)_第24张图片

防御此漏洞

使用 addslashes(),我们需要将 mysql_query 设置为 binary 的方式,才能防御此漏洞。

SET character_set_connection=gbk,character_set_result=gbk,character_set_client=binary,$conn

第34关 ------ 转utf16绕过

本关是 post 型的注入漏洞,同样的也是将 post 过来的内容进行了 ‘ \ 的处理。由上面的例 子可以看到我们的方法就是将过滤函数添加的 \ 给吃掉。而 get 型的方式我们是以 url 形式 提交的,因此数据会通过 URLencode,如何将方法用在 post 型的注入当中,我们此处介绍 一个新的方法。将 utf-8 转换为 utf-16 或 utf-32,例如将 ‘ 转为 utf-16 为 � ’ 。我们就 可以利用这个方式进行尝试。
[SQL注入][Advanced injection]sqli-labs学习记录(23-37关)_第25张图片
测试没问题[SQL注入][Advanced injection]sqli-labs学习记录(23-37关)_第26张图片

第35关 ------ 迷惑关卡

检查的函数仍然是它
[SQL注入][Advanced injection]sqli-labs学习记录(23-37关)_第27张图片
但是这里id没有用引号包裹起来,那直接传参数就行了
[SQL注入][Advanced injection]sqli-labs学习记录(23-37关)_第28张图片
也没有waf,奥里给了
[SQL注入][Advanced injection]sqli-labs学习记录(23-37关)_第29张图片

第36关 ------ escape_string

这道题关于此函数注入绕过https://www.dazhuanlan.com/2019/12/10/5deeb6a7f18e6/,这个博客有更详细的解释
[SQL注入][Advanced injection]sqli-labs学习记录(23-37关)_第30张图片

mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符。 下列字符受影响:

  • \x00
  • \n
  • \r
  • \
  • "
  • \x1a
    如果成功,则该函数返回被转义的字符串。如果失败,则返回 false。 但是因 mysql 我们并没有设置成 gbk,所以 mysql_real_escape_string()依旧能够被突破。方法 和上述是一样的。
    [SQL注入][Advanced injection]sqli-labs学习记录(23-37关)_第31张图片

第37关 ------ 34关+POST型

发现没问题哇哦
[SQL注入][Advanced injection]sqli-labs学习记录(23-37关)_第32张图片

参考文章

SQL注入绕过mysql_real_escape_string() - SQL injection that gets around mysql_real_escape_string()
MYSQL天书

你可能感兴趣的:(安全学习,#,Web)