一次常规的源码审计

admin 2025年4月11日11:12:26评论33 views字数 3511阅读11分42秒阅读模式

前言

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):一次常规的源码审计

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年4月11日11:12:26
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   一次常规的源码审计https://cn-sec.com/archives/3943953.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息