因str_replace导致的注入问题总结


Posted in PHP onAugust 08, 2019

研究了下replace的注入安全问题。

一般sql注入的过滤方式就是引用addslashes函数进行过滤。

因str_replace导致的注入问题总结

他会把注入的单引号转换成\',把双引号转换成\",反斜杠会转换成\\等

写一段php代码:

<!DOCTYPE html>
<html>
<head>
 <title></title>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
</head>
<body>
<?php
 $x=$_GET['x'];
 $id=str_replace(addslashes($_GET['y']),'',addslashes($x));
 echo "过滤后:".addslashes($x)."<br/>";
 echo "replace替换绕过:".$id."<br/>";
 $conn = mysql_connect('127.0.0.1','root','root');//连接mysql数据库 
 mysql_select_db('test',$conn);//选择$conn连接请求下的test数据库名 
 $sql = "select * from user1 where id='$id'";//定义sql语句并组合变量id 
 $result = mysql_query($sql);//执行sql语句并返回给变量result 
 while($row = mysql_fetch_array($result)){//遍历数组数据并显示 
  echo "ID".$row['id']."</br>"; 
  echo "用户名".$row['name']."</br>"; 
 } 
 mysql_close($conn);//关闭数据库连接 
 echo "<hr>"; 
 echo "当前语句:"; 
 echo $sql;
?>
</body>
</html>

发现是引用了addslashes函数的:

因str_replace导致的注入问题总结

一个单引号或者双引号直接被转义,字符串注入到这里基本上gg了。没戏了。

addslashes的问题:

addslashes会把%00转换成\0

addslashes会把单引号(')转换成\'

因为使用了str_replace函数,会替换那么输入%00' 就被addslashes函数自动添加\0\',然后我们匹配0,就变成了\\'再次转换成\',单引号成功逃逸。

<?php
 echo str_replace("0","","\0\'")
?>

\0\'就是我们输入的%00'

会输出:

因str_replace导致的注入问题总结

那么知道了原理根据上面的php代码构造合适的sql语句绕过addslashes过滤

因str_replace导致的注入问题总结

单引号成功逃逸,这里不能用单引号闭合了,后门闭合会被过滤那么直接:

返回真:

因str_replace导致的注入问题总结

返回假

因str_replace导致的注入问题总结

那么想出数据就很方便。这里不演示了常规语句就行了。

模拟环境没啥意思,去网上找了个别人的代码审计文章,找到了一个雨牛挖的cmseasy的str_replace绕过注入的真实案例

2014年的漏洞,cmseasy相关版本网上已经找不到了,我改写了个cmseasy,方便测试这个replace注入:

cmseasy环境下载:链接: https://pan.baidu.com/s/1KgHaPxuB3UI36fyx4IbW9w 提取码: 7aj3

存在问题的目录lib/plugins/pay/alipay.php

第87行用了str_replace替换

因str_replace导致的注入问题总结

替换后的内容赋值给了$order_sn

往下看发现调用了check_money函数,跟踪下这个函数查看内部实现:

uploads/lib/table/pay.php

因str_replace导致的注入问题总结

先是赋值然后调用了getrow函数,跟进去看看:

uploads/lib/inc/table.php

因str_replace导致的注入问题总结

condition没有啥数据库操作后跟下面那个函数,跟踪下rec_select_one:

还在table.php文件下:

因str_replace导致的注入问题总结

跟下sql_select函数:

因str_replace导致的注入问题总结

被带入数据库查询:

默认echo $sql;是被注释的,解除注释方便查看sql语句:

因为str_replace的缘故,可以被绕过进行sql注入:

去除注释符,构造poc:

http://localhost/CmsEasy/uploads/index.php/?case=archive&act=respond&code=alipay&trade_status=WAIT_SELLER_SEND_GOODS

       POST:out_trade_no=11111%00'&subject=0

 sql语句报错存在sql注入

因str_replace导致的注入问题总结

那么修复方案是什么呢?

回到刚开始的alipay.php

第79行

因str_replace导致的注入问题总结

正则匹配下\'

然后再次访问:

直接跳转了不再停留了。

因str_replace导致的注入问题总结

修复方案:

function respond() {
  if (!empty($_POST)) {
   foreach($_POST as $key =>$data) {
    if(preg_match('/(=|<|>|\')/', $data)){
     return false;
    }
    $_GET[$key] = $data;
   }
  }

参考文章:https://wizardforcel.gitbooks.io/php-common-vulnerability/content/23.html

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

PHP 相关文章推荐
PHP脚本的10个技巧(8)
Oct 09 PHP
mysql4.1以上版本连接时出现Client does not support authentication protocol问题解决办法
Mar 15 PHP
PHP 反射机制实现动态代理的代码
Oct 22 PHP
PHP版 汉字转码的实现详解
Jun 09 PHP
如何解决CI框架的Disallowed Key Characters错误提示
Jul 05 PHP
php使用substr()和strpos()联合查找字符串中某一特定字符的方法
May 12 PHP
PHP进行批量任务处理不超时的解决方法
Jul 11 PHP
laravel获取不到session的三种解决办法【推荐】
Sep 16 PHP
PHP设计模式之策略模式原理与用法实例分析
Apr 04 PHP
php使用curl伪造浏览器访问操作示例
Sep 30 PHP
php+ajax实现文件切割上传功能示例
Mar 03 PHP
PHP中的异常处理机制深入讲解
Nov 10 PHP
PHP goto语句用法实例
Aug 06 #PHP
Laravel 6 将新增为指定队列任务设置中间件的功能
Aug 06 #PHP
Yii框架核心组件类实例详解
Aug 06 #PHP
PHP使用Session实现上传进度功能详解
Aug 06 #PHP
PHP使用ajax的post方式下载excel文件简单示例
Aug 06 #PHP
PHP中的自动加载操作实现方法详解
Aug 06 #PHP
Thinkphp自定义生成缩略图尺寸的方法
Aug 05 #PHP
You might like
十天学会php(2)
2006/10/09 PHP
用PHP实现ODBC数据分页显示一例
2006/10/09 PHP
php截取字符串并保留完整xml标签的函数代码
2013/02/06 PHP
PHP整合PayPal支付
2015/06/11 PHP
PHP+JS三级菜单联动菜单实现方法
2016/02/24 PHP
简单谈谈PHP中strlen 函数
2016/02/27 PHP
[原创]php常用字符串输出方法分析(echo,print,printf及sprintf)
2016/07/09 PHP
利用 fsockopen() 函数开放端口扫描器的实例
2017/08/19 PHP
php生成HTML文件的类方法
2019/10/11 PHP
PHP7 错误处理机制修改
2021/03/09 PHP
jQuery.Autocomplete实现自动完成功能(详解)
2010/07/13 Javascript
JQuery文本框高亮显示插件代码
2011/04/02 Javascript
jQuery插件kinMaxShow扩展效果用法实例
2015/05/04 Javascript
Javascript中return的使用与闭包详解
2017/01/11 Javascript
bootstrap vue.js实现tab效果
2017/02/07 Javascript
jQuery实现文档树效果
2017/02/20 Javascript
JS实现隔行换色的表格排序
2017/03/27 Javascript
AngularJS实现页面跳转后自动弹出对话框实例代码
2017/08/02 Javascript
jQuery实现table中两列CheckBox只能选中一个的示例
2017/09/22 jQuery
详解js创建对象的几种方法及继承
2019/04/12 Javascript
vue(2.x,3.0)配置跨域代理
2019/11/27 Javascript
JS实现省市县三级下拉联动
2020/04/10 Javascript
Python实现单词拼写检查
2015/04/25 Python
numpy中实现二维数组按照某列、某行排序的方法
2018/04/04 Python
python调用xlsxwriter创建xlsx的方法
2018/05/03 Python
python3解析库pyquery的深入讲解
2018/06/26 Python
pycharm运行程序时看不到任何结果显示的解决
2020/02/21 Python
使用sklearn对多分类的每个类别进行指标评价操作
2020/06/11 Python
python缩进长度是否统一
2020/08/02 Python
Python非单向递归函数如何返回全部结果
2020/12/18 Python
CSS3 圆角效果
2009/07/15 HTML / CSS
10分钟理解CSS3 Grid布局
2018/12/20 HTML / CSS
2015年元旦文艺汇演主持词
2014/03/26 职场文书
学术诚信承诺书
2014/05/26 职场文书
技术员个人工作总结
2015/03/03 职场文书
2015年大学生入党自荐书
2015/03/24 职场文书