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 的内容。
此处我们想一个问题: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 才能到汉字的范围)。我们在过滤 ’ 的时候,往往利用的思 路是将 ‘ 转换为 \’ (转换的函数或者思路会在每一关遇到的时候介绍)。 因此我们在此想办法将 ‘ 前面添加的 \ 除掉,一般有两种思路:
现在水平也不高,做不出来,虽然不能直接去看别人的WP,但是看下源码思考下,就当训练代码审计,发现注释符号被注释了QAQ
再看$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
sql注入的语句,那么现在能走的路应该就是闭合的方式了
没问题哈,那这道题也算做完了,后面查表太简单了
我们注册一个名为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'
看登录成功了哈哈哈
如何绕过 or 和 and 过滤。一般性提供以下几种思路:
(1)大小写变形 Or,OR,oR
(2)编码,hex,urlencode
(3)添加注释/*or*/
(4)利用符号 and=&&
or=||
如何解决这道题可以使用时间盲注或者报错注入,我懒,直接报错注入吧
这关不输出报错信息了,考虑延时盲注或者联合查询吧
本关结合 25 关,将空格,or,and,/*,#,–,/等各种符号过滤,此处对于 and,or 的处理方 法不再赘述,参考 25.此处我们需要说明两方面:对于注释和结尾字符的我们此处只能利用 构造一个 ’ 来闭合后面到 ’ ;
对于空格,有较多的方法:
%09
TAB 键(水平)
%0a
新建一行
%0c
新的一页
%0d
return 功能
%0b
TAB 键(垂直
%a0
空格
括号()
/**/
没问题,很完美,当然报错注入、延时注入也很OK,懒得写了
这关与 26 的区别在于,sql 语句添加了一个括号,同时在 sql 语句执行抛出错误后并 不在前台页面输出。所有我们排除报错注入,这里依旧是利用 union 注入
sql 语句为 SELECT * FROM users WHERE id=(’$id’) LIMIT 0,1
因此我们构造payload')union%a0select%a01,2,('3
,这样一方面满足了绕过,另一方面也补齐全了union select的需要三个参数
从源码不难发现,没有区分大小写,因此我们只需要稍微改一下上面参数
很完美就绕过了,没啥难度
此外uniunionon 也是可以突破限制的。亦可以利用报错注入和延时注入的语法进行注入。
比前面的题都简单无数倍,没搞懂啥意思(后面懂了HTTP参数污染攻击,他单纯模仿了这个函数,虽然没作用)
看下源码呢,看看也没有啥高级操作,一脸蒙蔽不知道出题人这道题意图是撒谎,估计是为下一题提示?
这道题有点小坑的地方就是不输出出错函数,因此也无法用order by去判断列数,只能直接union select来通过输出判断有三列
下面就是打组合拳的事情了,没啥难度
上述函数为过滤 ‘ \ 的函数,将 ‘ 转为 \’ , 将 \ 转为 \ ,将 “ 转为 \”。因此 此处我们只能考虑 background 中的第一个思路,添加一个%df 后,将%5c 消除即可,因此可以构造payload
这一关和上一关不同,使用内置函数
addslashes() 函数返回在预定义字符之前添加反斜杠的字符串。该函数可用于为存储在数据库中的字符串以及数据库查询语句准备字符串。
预定义字符是:
- 单引号(’)
- 双引号(")
- 反斜杠(\)
Addslashes()函数和我们在 32 关实现的功能基本一致的,所以我们依旧可以利用%df 进行绕过。
使用 addslashes(),我们需要将 mysql_query 设置为 binary 的方式,才能防御此漏洞。
SET character_set_connection=gbk,character_set_result=gbk,character_set_client=binary”,$conn
本关是 post 型的注入漏洞,同样的也是将 post 过来的内容进行了 ‘ \ 的处理。由上面的例 子可以看到我们的方法就是将过滤函数添加的 \ 给吃掉。而 get 型的方式我们是以 url 形式 提交的,因此数据会通过 URLencode,如何将方法用在 post 型的注入当中,我们此处介绍 一个新的方法。将 utf-8 转换为 utf-16 或 utf-32,例如将 ‘ 转为 utf-16 为 � ’ 。我们就 可以利用这个方式进行尝试。
测试没问题
检查的函数仍然是它
但是这里id没有用引号包裹起来,那直接传参数就行了
也没有waf,奥里给了
这道题关于此函数注入绕过https://www.dazhuanlan.com/2019/12/10/5deeb6a7f18e6/,这个博客有更详细的解释
mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符。 下列字符受影响:
SQL注入绕过mysql_real_escape_string() - SQL injection that gets around mysql_real_escape_string()
MYSQL天书