某 thinkphp3.2.3 代码审计

Mr.Wu 2,966 1 正在检测是否收录...

某日和某基友一起挖洞,记录一下,过程忽略,折腾几天找到如下漏洞。

程序过滤

function getValue($name, $type = 'str')
{
	$data = array(' ', '\'', '<', '>', '"', '&lt;', '&gt;', '&quot;', 'script', 'insert', 'delete', 'update', 'select', 'drop', 'exec', 'and', 'or', 'eval');

	if ($type == 'array') {
		$value = I($name);

		foreach ($value as $key => $i) {
			$value[$key] = str_ireplace($data, '', $i);
		}
	}
	else {
		$value = str_ireplace($data, '', I($name));

		switch ($type) {
		case 'str':
			$value = strval($value);
			break;

		case 'int':
			$value = intval($value);
			break;

		case 'float':
			$value = floatval($value);
			break;
		}
	}

	return $value;
}

function getContent($name)
{
	$data = array('script', 'insert', 'delete', 'update', 'select', 'drop', 'exec', 'and', 'or', 'eval');
	$value = I($name, '', 'htmlspecialchars');
	$value = str_ireplace($data, '', $value);
	return $value;
}

function getData($database, $type, $where = '', $limit = '', $order = 'id asc', $group = '')
{
	if ($type == 'all') {
		$data = M($database)->where($where)->limit($limit)->order($order)->group($group)->select();
	}
	else {
		$data = M($database)->where($where)->limit($limit)->order($order)->find();
	}

	return $data;
}

1.pay() 函数中参数未过滤导致 sql 注入

某 thinkphp3.2.3 代码审计
可以看到,Handle 控制器下的 pay() 没有过滤,不过构造需要知道 getAlipayInfo() 的定义
某 thinkphp3.2.3 代码审计
知道 key 的值,还需要知道 sign 签名的值,这个值经过加密处理:

strtoupper(md5($tno . $payno . $money . $md5key))

直接输出值就好了:
某 thinkphp3.2.3 代码审计
然后构造注入:
某 thinkphp3.2.3 代码审计

2.注册处 X-Forwarded-For SQL注入

某 thinkphp3.2.3 代码审计
getip() 没有过滤,跟过去看看
某 thinkphp3.2.3 代码审计
某 thinkphp3.2.3 代码审计

3.反斜杠配合双写进行 sql 注入

文章开头处我贴出了过滤代码,这个代码没有对 "\" 反斜杠进行过滤,因此使用"\" 可以报错,不过过滤了单引号,无法闭合语句,也就无法注入,需要找到一处没有单引号的语句,但是我没找到,不过找到了一处支持双写的语句
某 thinkphp3.2.3 代码审计
某 thinkphp3.2.3 代码审计
某 thinkphp3.2.3 代码审计
还有一处未授权访问和绕过登陆脱数据的洞,时间关系这里就不继续复述了。发个文凑下博客收录。

打赏
发表评论 取消回复
表情 图片 链接 代码

  1. asD
    asD Lv 1

    很棒 学习了

分享
微信
微博
QQ