前言
php代码审查,追踪一次SQL注入攻击并成功其通过文件上传实施远程代码执行(rce)以及其他危害漏洞审计。
SQL注入
下面的代码可以发现
exportExcel("$get_tab",stripslashes(base64_decode($get_sql)));
,其中使用了stripslashes
函数,该函数可以移除反斜杠,但它不会处理其他潜在的安全问题,比如下面所产生的SQL注入。
<?php
require_once("global.func.php");
require_once("include/language_cn.php");
$arr_tab = array();
$arr_tab['部门'] = "select id,department_name,department_desc,start_ip,end_ip from tb_department;";
$arr_tab['用户'] = "select `id`,`group_id`,`user_name`,`user_ip`,`user_mac`,`desc`,`user_mobile`,`user_tel`,`user_email`,`type` as `user_type` from tb_user";
if(isset($_GET['type'])) $get_type = $_GET['type'];
if(isset($_GET['tab'])) $get_tab = $_GET['tab'];
if(isset($_GET['sql'])) $get_sql = $_GET['sql'];
if($get_type == "exportexcel")
{
exportExcel("$get_tab",$arr_tab[$get_tab]);
}
if($get_type == "exportexcelbysql")
{
$get_tab = $arr_export_cn[$get_tab];
exportExcel("$get_tab",stripslashes(base64_decode($get_sql)));
}
if($get_type == "exportexcelbystring")
{
exportExcelByString($get_tab,$get_sql);
}
?>
并且通过上述代码我们可以发现接收三个参数,其中第一个为type类型,还有一个为$get_tab,$get_tab由$arr_export_cn数组的来,我们可以跟进查看,发现是一个全局数组,里面全是日志相关的东西,任意选择一个即可
然后最终是$get_sql参数,该参数为的SQL注入点,最终调用exportExcel函数进行处理,跟进exportExcel函数,可以发现接收两个参数其中第一个就是$get_tab为日志相关的,其实就是打印下载文件,还有一个就是$sql参数,这个参数就是sql语句,其中传入进来的SQL语句没有经过任何过滤直接使用mysql_query函数进行执行,从而导致sql注入漏洞
function exportExcel($filename,$sql)
{
if(strstr($sql,"xxxxxx_log"))
{
conn();
}
else
{
connOther();
}
......
........
$result = mysql_query($sql);
$total = mysql_num_rows($result);
$num = mysql_num_fields($result);
因此我们可以构造SQL语句上传木马进去,然后直接RCE,这里直接把上传的内容先进行16进制编码
直接使用into outfile进行文件上传至网站根目录,如下SQL语句:
select 0x3c3f3d706870696e666f28293b3f3e into outfile '/xxx/xxx/xnfiglp.php'
不过通过上述可以发现这个sql语句是需要进行base64编码的,因此还需要编码
然后构造payload请求包进行SQL执行,浏览器访问成功。
SQL注入2
这里还有一个代码,执行的方式和上述的SQL注入类似,都是通过传入base64编码的SQL语句然后导致的文件上传RCE
<?php
include_once("global.func.php");
include_once("include/language_cn.php");
if(isset($_GET['type'])) $get_type = $_GET['type'];
if(isset($_GET['tab'])) $get_tab = $_GET['tab'];
if(isset($_GET['sql'])) $get_sql = $_GET['sql'];
.....
elseif($get_type == "exportxxxx")
{
$get_tab = $arr_export_cn[$get_tab];
exportHtmlMail("$get_tab",stripslashes(base64_decode($get_sql)));
}
...
?>
唯一不同的一点是通过exportHtmlMail函数进行处理,我们跟进exportHtmlMail函数查看,也没啥看的,和上述的大概差不多,都是通过mysql_query函数进行执行
function exportHtmlMail($filename,$sql)
{
Header( "Expires: 0" );
Header( "Pragma: public" );
Header( "Cache-Control: must-revalidate, post-check=0, pre-check=0" );
Header( "Cache-Control: public");
Header( "Content-Type: application/octet-stream" );
header("Accept-Ranges: bytes");
header("Content-Disposition: attachment; filename=$filename.html");
...
$conn = connOther();
$result = mysql_query($sql,$conn);
...
用上述请求包换一个请求路径和payload执行SQL语句上传文件成功
硬编码SQL注入
这里有段代码,看起来就像是SQL注入的情况,而且很简单,看起来像后门一样,首先是需要判断用户输入的明文密码进行md5编码后与pass变量相等然后POST传参SQL语句进行执行
<?php
include_once('../global.func.php');
session_start();
set_time_limit(0);
$pass="3ff5b5f7xxxxxxxbee7821";
conn();
$time=0;
$sql="";
if(isset($_POST['pass']))
{
if(md5($_POST['pass'])==$pass)
{
$_SESSION['tool']="on";
}
}
if(isset($_POST['txt']))
{
$sql=stripslashes($_POST['txt']);
echo $sql;
$t1=microtime_float();
$res=mysql_query($sql);
$t2=microtime_float();
if($res)
{
$time=$t2-$t1;
}
}
这里首先要知道md5加密的值是多少,网上CMD5查询要钱,真的B了gou
换一个网站解密,这个可以,恩。。。这个网站不错,实名推荐。
https://www.somd5.com/
然后登录过后,直接执行select current_user();语句,成功执行。
这里还发现一个问题,查看如下代码,发现会把用户输入的sql语句echo出来,因此这里存在XSS注入
if(isset($_POST['txt']))
{
$sql=stripslashes($_POST['txt']);
echo $sql;
直接传参即可,哈哈哈,而且这个地方不需要登录。
信息泄露
这里通过脚本找文件关键字还找到一个phpinfo信息泄露,哈哈哈写的真的抽象,我都怀疑开发人员做测试遗留下来的。
原文始发于微信公众号(蓝云Sec):一次常规的源码审计
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论