因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 相关文章推荐
如何去掉文章里的 html 语法
Oct 09 PHP
php smarty模版引擎中的缓存应用
Dec 02 PHP
php中使用explode查找某个字符是否存在的方法
Jul 12 PHP
PHP小技巧之JS和CSS优化工具Minify的使用方法
May 19 PHP
ThinkPHP中U方法的使用浅析
Jun 13 PHP
php使用simplexml_load_file加载XML文件并显示XML的方法
Mar 19 PHP
php获取访问者IP地址汇总
Apr 24 PHP
PHP实现根据银行卡号判断银行
Apr 29 PHP
基于PHP代码实现中奖概率算法可用于刮刮卡、大转盘等抽奖算法
Dec 20 PHP
PHP编程 SSO详细介绍及简单实例
Jan 13 PHP
详解PHP多个进程配合redis的有序集合实现大文件去重
Mar 06 PHP
ThinkPHP5与单元测试PHPUnit使用详解
Feb 23 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
SONY ICF-SW07收音机电路分析
2021/03/02 无线电
PHP实现文件下载断点续传详解
2014/10/15 PHP
微信公众平台实现获取用户OpenID的方法
2015/04/15 PHP
php封装一个异常的处理类
2017/06/08 PHP
学习YUI.Ext 第二天
2007/03/10 Javascript
JavaScript中null与undefined分析
2009/07/25 Javascript
js DOM模型操作
2009/12/28 Javascript
(function($){...})(jQuery)的意思
2010/07/22 Javascript
JavaScript 原型链学习总结
2010/10/29 Javascript
JavaScript异步调用定时方法并停止该方法实现代码
2012/03/16 Javascript
js 剪切板的用法(clipboardData.setData)与js match函数介绍
2013/11/19 Javascript
关于JavaScript命名空间的一些心得
2014/06/07 Javascript
浅析JS异步加载进度条
2016/05/05 Javascript
彻底解决 webpack 打包文件体积过大问题
2017/07/07 Javascript
元素全屏的设置与监听实例
2017/11/28 Javascript
动态加载JavaScript文件的3种方式
2018/05/05 Javascript
vue 数据双向绑定的实现方法
2021/03/04 Vue.js
[06:25]第二届DOTA2亚洲邀请赛主赛事第二天比赛集锦.mp4
2017/04/03 DOTA
在arcgis使用python脚本进行字段计算时是如何解决中文问题的
2015/10/18 Python
Python编程之字符串模板(Template)用法实例分析
2017/07/22 Python
用python编写第一个IDA插件的实例
2018/05/29 Python
Django添加KindEditor富文本编辑器的使用
2018/10/24 Python
Python UnboundLocalError和NameError错误根源案例解析
2018/10/31 Python
详解python-图像处理(映射变换)
2019/03/22 Python
python中for循环变量作用域及用法详解
2019/11/05 Python
html5的自定义data-*属性与jquery的data()方法的使用
2014/07/02 HTML / CSS
eharmony澳大利亚:网上约会服务
2020/02/29 全球购物
优秀管理者获奖感言
2014/02/17 职场文书
退休教师欢送会主持词
2014/03/31 职场文书
《和田的维吾尔》教学反思
2014/04/14 职场文书
《美丽的丹顶鹤》教学反思
2014/04/22 职场文书
学雷锋树新风演讲稿
2014/05/10 职场文书
打架赔偿协议书范本
2014/10/26 职场文书
2015年客房服务员工作总结
2015/05/15 职场文书
2016国庆促销广告语
2016/01/28 职场文书
详解Java线程池是如何重复利用空闲线程的
2021/06/26 Java/Android