因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 相关文章推荐
PHP4实际应用经验篇(9)
Oct 09 PHP
快速开发一个PHP扩展图文教程
Dec 12 PHP
php获取当前网址url并替换参数或网址的方法
Jun 06 PHP
php查找任何页面上的所有链接的方法
Dec 03 PHP
php读取目录所有文件信息dir示例
Mar 18 PHP
PHP中echo和print的区别
Aug 28 PHP
php发送html格式文本邮件的方法
Jun 10 PHP
PHP中遇到的时区问题解决方法
Jul 23 PHP
PHP给源代码加密的几种方法汇总(推荐)
Feb 06 PHP
PHP切割汉字的常用方法实例总结
Apr 27 PHP
php设计模式之组合模式实例详解【星际争霸游戏案例】
Mar 27 PHP
ThinkPHP5框架中使用JWT的方法示例
Jun 03 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 字符串编码截取函数(兼容utf-8和gb2312)
2009/05/02 PHP
php自动更新版权信息显示的方法
2015/06/19 PHP
网络图片延迟加载实现代码 超越jquery控件
2010/03/27 Javascript
JS保留小数点(四舍五入、四舍六入)实现思路及实例
2013/04/25 Javascript
jquery模拟LCD 时钟的html文件源代码
2014/06/16 Javascript
JavaScript之数组(Array)详解
2015/04/01 Javascript
jquery实现简单Tab切换菜单效果
2020/07/17 Javascript
9个让JavaScript调试更简单的Console命令
2016/11/14 Javascript
基于Vue实现tab栏切换内容不断实时刷新数据功能
2017/04/13 Javascript
JavaScript数据结构之双向链表定义与使用方法示例
2017/10/27 Javascript
微信小程序实现页面下拉刷新和上拉加载功能详解
2018/12/03 Javascript
vue项目前端埋点的实现
2019/03/06 Javascript
详解关于JSON.parse()和JSON.stringify()的性能小测试
2019/03/14 Javascript
浅谈JS中this在各个场景下的指向
2019/08/14 Javascript
JS实现秒杀倒计时特效
2020/01/02 Javascript
JS常用跨域方法实现原理解析
2020/12/09 Javascript
使用python装饰器验证配置文件示例
2014/02/24 Python
Python入门篇之列表和元组
2014/10/17 Python
OpenCV实现人脸识别
2017/04/07 Python
pyshp创建shp点文件的方法
2018/12/31 Python
解决py2exe打包后,总是多显示一个DOS黑色窗口的问题
2019/06/21 Python
Python求均值,方差,标准差的实例
2019/06/29 Python
python通过robert、sobel、Laplace算子实现图像边缘提取详解
2019/08/21 Python
Python性能分析工具py-spy原理用法解析
2020/07/27 Python
经济实惠的名牌太阳镜和眼镜:Privé Revaux
2021/02/07 全球购物
JPA面试常见问题
2016/11/14 面试题
设置器与访问器的定义以及各自特点
2016/01/08 面试题
初二政治教学反思
2014/01/12 职场文书
网上商城创业计划书范文
2014/01/31 职场文书
房产继承公证书
2014/04/09 职场文书
《月球之谜》教学反思
2014/04/10 职场文书
法制宣传标语集锦
2014/06/25 职场文书
党的群众路线教育实践活动通讯稿
2014/09/10 职场文书
技术股份合作协议书
2014/10/05 职场文书
工作失职检讨书
2015/01/26 职场文书
初中运动会闭幕词范本3篇
2019/12/09 职场文书