从零开始审计海洋cmsv10.1(2)

上一期我们提到了由于i.php内的remote_addr方法覆盖了存在漏洞的HTTP_X_FORWARDED_FOR方法,而且也经过了一段正则匹配进一步打消了通过路由构造sql注入语句篡改ip地址进行的入侵操作,所以这一条路就基本上没戏了,不过我们也不要灰心,我们继续来审计其他可能会产生的漏洞文件:
在这里插入图片描述
依旧是在i.php文件内,漏洞描述说是sql语句insert中插入变量无单引号保护,可能存在sql注入漏洞,那么我们就直接进入i.php内一探究竟

从零开始审计海洋cmsv10.1(2)_第1张图片
我已经把里面的源码解释给写出来了,乍一看这块代码可能不太理解他是做什么的,我们从头开始看一下

function GetRealIP()
{

	if(!empty($_SERVER["REMOTE_ADDR"]))
	{
		$cip = $_SERVER["REMOTE_ADDR"];
	}
	else if(!empty($_SERVER["HTTP_X_FORWARDED_FOR"]))
	{
		$cip = $_SERVER["HTTP_X_FORWARDED_FOR"];
	}
	else
	{
		$cip = '';
	}
	preg_match("/[\d\.]{7,15}/", $cip, $cips);
	$cip = isset($cips[0]) ? $cips[0] : 'unknown';
	unset($cips);
	return $cip;
}

$bip = GetRealIP();   

$row = $dsql->GetOne("Select * from sea_ie where ip='$bip'");

if(!is_array($row))
{

	$dsql->ExecuteNoneQuery("insert into sea_ie values('','$bip',NOW())");

	$sql="Update sea_member set points = points+$i where id=$u";

	$dsql->ExecuteNoneQuery("$sql");

	showmsg('感谢您的支持,现在将自动跳转到首页', 'index.php');exit;
}

这就是完整的代码了,可以看到这段代码跟上一期是承上启下的作用,在GetRealIP中获取用户真实ip,将这个ip带入到数据库中去查询,然后将返回值保存成$row,这里如果说数据库找不到这个ip的话,肯定是返回空值的,所以下面用if语句判断了如果row的值不为空,那么执行下面的签到命令,可以看到这里出现了许多与数据库进行交互的语句,第一个获取到用户ip后带入到数据库中进行查询

$row = $dsql->GetOne("Select * from sea_ie where ip='$bip'");

这里我们上一期也说了,由于获取用户ip使用的是remote_addr方法,所以没办法通过伪造ip的手段来构造我们的sql注入语句,所以这一段的bip我们没办法来利用

还有当row的值不为空的时候,程序会执行返回一个不显示的数据库查询结果

$dsql->ExecuteNoneQuery("insert into sea_ie values('','$bip',NOW())");

这段查询语句拼接了bip变量,很不巧bip变量恰恰是GetRealIP()的返回值,所以我们又没办法去利用,那么这段也只好放弃

那么我们还有最后一个数据库查询语句

$sql="Update sea_member set points = points+$i where id=$u";

那么问题来了,这个$u变量是在哪里出现的呢?我使用了seay的全文追踪工具来查询

从零开始审计海洋cmsv10.1(2)_第2张图片
语句已经加上注释
可以看到$u第一次出现是被赋予了一个获取到的uid的值,但很不幸,前面加上了限定语句addslashes,所以这一条路也基本上就堵死了

从零开始审计海洋cmsv10.1(2)_第3张图片
以下还有一些数据库交互语句,但是大体看了一下与上面的相同,所以基本排除sql注入

但现在,i.php中的几个关键代码基本上就全部审计完成了,虽然没有找到漏洞,但是也让我大体的了解一下这款cms的代码风格,可以看到写的还是非常易懂的,没有什么过分复杂的语句,其实在更新这篇文章之前,我已经审计出来了这款cms的一个漏洞,但是由于已经提交了补天,所以要等他们审核通过才能发布,大家拭目以待吧

你可能感兴趣的:(代码审计,php,安全)