因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 相关文章推荐
数据库的日期格式转换
Oct 09 PHP
PHP读取目录下所有文件的代码
Jan 07 PHP
PHP 截取字符串函数整理(支持gb2312和utf-8)
Feb 16 PHP
PHP5 字符串处理函数大全
Mar 23 PHP
phpQuery占用内存过多的处理方法
Nov 13 PHP
PHP实现的简易版图片相似度比较
Jan 07 PHP
php命令行(cli)模式下报require 加载路径错误的解决方法
Nov 23 PHP
yii2 modal弹窗之ActiveForm ajax表单异步验证
Jun 13 PHP
功能强大的PHP POST提交数据类
Jul 15 PHP
php中实现字符串翻转的方法
Feb 22 PHP
thinkPHP5.0框架事务处理操作简单示例
Sep 07 PHP
PHP封装的mysqli数据库操作类示例
Feb 16 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上传apk后自动提取apk包信息的使用(示例下载)
2013/04/26 PHP
深入分析使用mysql_fetch_object()以对象的形式返回查询结果
2013/06/05 PHP
php绘图之在图片上写中文和英文的方法
2015/01/24 PHP
php图形jpgraph操作实例分析
2017/02/22 PHP
PHP实现数组向任意位置插入,删除,替换数据操作示例
2019/04/05 PHP
JavaScript 克隆数组最简单的方法
2009/02/12 Javascript
js操作iframe的一些方法介绍
2013/06/25 Javascript
javascript实现复选框选中属性
2015/03/25 Javascript
JavaScript实现页面5秒后自动跳转的方法
2015/04/16 Javascript
详解jQuery Mobile自定义标签
2016/01/06 Javascript
JavaScript事件类型中UI事件详解
2016/01/14 Javascript
jQuery Raty 一款不错的星级评分插件
2016/08/24 Javascript
Angularjs在360兼容模式下取数据缓存问题的解决办法
2017/06/22 Javascript
jQuery使用ajax_动力节点Java学院整理
2017/07/05 jQuery
Django+Vue.js搭建前后端分离项目的示例
2017/08/07 Javascript
jQuery实现table表格checkbox全选的方法分析
2018/07/04 jQuery
vue数据操作之点击事件实现num加减功能示例
2019/01/19 Javascript
使用Angular Cli如何创建Angular私有库详解
2019/01/30 Javascript
在mpvue框架中使用Vant WeappUI组件库的注意事项【推进】
2019/06/09 Javascript
[02:55]DOTA2英雄基础教程 发条技师
2013/12/04 DOTA
Python实现将一个正整数分解质因数的方法分析
2017/12/14 Python
对pandas写入读取h5文件的方法详解
2018/12/28 Python
python异步存储数据详解
2019/03/19 Python
python django生成迁移文件的实例
2019/08/31 Python
详解pytorch中squeeze()和unsqueeze()函数介绍
2020/09/03 Python
8款使用 CSS3 实现超炫的 Loading(加载)的动画效果
2015/03/17 HTML / CSS
美国著名的团购网站:Woot
2016/08/02 全球购物
教育系毕业生中文求职信范文
2013/10/06 职场文书
中青班党性分析材料
2014/02/16 职场文书
护士求职自荐信范文
2015/03/04 职场文书
八月一日观后感
2015/06/10 职场文书
2016年母亲节广告语
2016/01/28 职场文书
nginx配置ssl实现https的方法示例
2021/03/31 Servers
Java新手教程之ArrayList的基本使用
2021/06/20 Java/Android
详解Java实现数据结构之并查集
2021/06/23 Java/Android
解决Vmware虚拟机安装centos8报错“Section %Packages Does Not End With %End. Pane Is Dead”
2022/06/01 Servers