因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删除字符串末尾子字符,删除开始字符,删除两端字符(实现代码)
Jun 27 PHP
php遍历文件夹和文件列表示例分享
Mar 11 PHP
php通过数组实现多条件查询实现方法(字符串分割)
May 06 PHP
使用PHP生成图片的缩略图的方法
Aug 18 PHP
PHP树-不需要递归的实现方法
Jun 21 PHP
CI框架无限级分类+递归的实现代码
Nov 01 PHP
详解EventDispatcher事件分发组件
Dec 25 PHP
php使用curl模拟浏览器表单上传文件或者图片的方法
Nov 10 PHP
php多进程模拟并发事务产生的问题小结
Dec 07 PHP
Laravel框架定时任务2种实现方式示例
Dec 08 PHP
Thinkphp 框架扩展之行为扩展原理与实现方法分析
Apr 23 PHP
PHP mkdir创建文件夹实现方法解析
Nov 13 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递归函数返回值使用方法
2013/02/18 PHP
js或者jquery判断图片是否加载完成实现代码
2013/03/20 Javascript
jquery高级编程的最佳实践详解
2014/03/23 Javascript
我的Node.js学习之路(一)
2014/07/06 Javascript
jQuery实现的图文高亮滚动切换特效实例
2015/08/10 Javascript
JS实现鼠标滑过折叠与展开菜单效果代码
2015/09/06 Javascript
全系IE支持Bootstrap的解决方法
2015/10/19 Javascript
JQuery实现Ajax加载图片的方法
2015/12/24 Javascript
基于Node.js的强大爬虫 能直接发布抓取的文章哦
2016/01/10 Javascript
javascript中apply、call和bind的使用区别
2016/04/05 Javascript
angular.js之路由的选择方法
2016/09/24 Javascript
jQuery实现jQuery-form.js实现异步上传文件
2017/04/28 jQuery
微信小程序实现运动步数排行功能(可删除)
2018/07/05 Javascript
vue在index.html中引入静态文件不生效问题及解决方法
2019/04/29 Javascript
js常见遍历操作小结
2019/06/06 Javascript
[04:29]2016国际邀请赛中国区预选赛Ehome战队教练采访
2016/06/27 DOTA
Python多线程扫描端口代码示例
2018/02/09 Python
Django生成PDF文档显示在网页上以及解决PDF中文显示乱码的问题
2019/07/04 Python
python3读取图片并灰度化图片的四种方法(OpenCV、PIL.Image、TensorFlow方法)总结
2019/07/04 Python
使用python将多个excel文件合并到同一个文件的方法
2019/07/09 Python
Python3如何对urllib和urllib2进行重构
2019/11/25 Python
20行Python代码实现一款永久免费PDF编辑工具的实现
2020/08/27 Python
python实现单机五子棋
2020/08/28 Python
Pyqt助手安装PyQt5帮助文档过程图解
2020/11/20 Python
美国流行背包品牌:JanSport(杰斯伯)
2018/03/02 全球购物
英国领先的运动物理治疗供应公司:Vivomed
2018/07/14 全球购物
Luxplus荷兰:以会员价购买美容产品等,独家优惠
2019/08/30 全球购物
be2台湾单身男女交友:全球网路婚姻介绍的领导品牌
2019/10/11 全球购物
大学生职业生涯规划书模版
2013/12/30 职场文书
法定代表人授权委托书范本
2014/10/07 职场文书
给老婆的保证书怎么写
2015/05/08 职场文书
新学期家长寄语2016
2015/12/03 职场文书
新西兰:最新留学学习计划书写作指南
2019/07/15 职场文书
python 逐步回归算法
2021/04/06 Python
python munch库的使用解析
2021/05/25 Python
Canvas如何做个雪花屏版404的实现
2021/09/25 HTML / CSS