51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

某 thinkphp3.2.3 代码审计

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

程序过滤

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 =&gt; $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 代码审计 还有一处未授权访问和绕过登陆脱数据的洞,时间关系这里就不继续复述了。发个文凑下博客收录。

赞(0)
未经允许不得转载:工具盒子 » 某 thinkphp3.2.3 代码审计