PHPCMS2008 SQL注入漏洞

实验环境
  • 实验环境
    • 操作机: Windows XP
    • 目标网址: www.test.ichunqiu

实验目的

  • 掌握本次漏洞的原理及其利用方法
  • 学会如何修复Sql注入漏洞

实验工具

Tamper Data:它是火狐浏览器的一款插件,主要功能如下:

  • 可以用来查看和修改 HTTP/HTTPS 的头部和 POST 参数;
  • 可以用来跟踪 HTTP 请求和响应
  • 可以对 WEB 站点进行某些安全测试,用来调试 WEB 配置十分方便

实验内容


PHPCMS

PHPCMS网站管理系统是国内主流的CMS系统之一,目前已有数万网站的应用规模,拥有政府、企业、媒体等各个行业进千名商业用户。

漏洞介绍

PHPCMS2008由于广告模块取referer不严,导致一处sql注入漏洞.可以得到管理员用户名与密码,攻击者登录后台后可能会获取webshell,对服务器进行进一步的渗透。

影响范围

PHPCMS 2008 版本

漏洞危害

攻击者通过SQL注入漏洞,获取获取后台管理员账号密码,进一步可能得到Webshell,并对服务器安全造成极大的威胁

什么是 SQL注入(SQL Injection )

认识SQL注入

SQL注入漏洞可以说是在企业运营中会遇到的最具破坏性的漏洞之一,它也是目前被利用得最多的漏洞。要学会如何防御SQL注入,我们首先要对他进行了解。

SQL注入(SQLInjection)是这样一种漏洞:当我们的Web app 在向后台数据库传递SQL语句进行数据库操作时。如果对用户输入的参数没有经过严格的过滤处理,那么攻击者就可以构造特殊的SQL语句,直接输入数据库引擎执行,获取或修改数据库中的数据。

  • SQL注入漏洞的本质是把用户输入的数据当做代码来执行,违背了数据与代码分离的原则。
  • SQL注入漏洞有两个关键条件,理解这两个条件可以帮助我们理解并防御SQL注入漏洞:
    • 用户能控制输入的内容
    • Web应用执行的代码中,拼接了用户输入的内容
SQL注入原理
  • SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。
SQL注入攻击的产生
  • 当应用程序使用输入内容来构造动态SQL语句以访问数据库时,会发生SQL注入攻击。 如果代码使用存储过程,而这些存储过程作为包含未筛选的用户输入的字符串来传递,也会发生SQL注入。
  • SQL注入可能导致攻击者使用应用程序登陆在数据库中执行命令。相关的SQL注入可以通过测试工具pangolin进行。如果应用程序使用特权过高的帐户连接到数据库,这种问题会变得很严重。在某些表单中,用户输入的内容直接用来构造动态SQL命令,或者作为存储过程的输入参数,这些表单特别容易受到SQL注入的攻击。而许多网站程序在编写时,没有对用户输入的合法性进行判断或者程序中本身的变量处理不当,使应用程序存在安全隐患。这样,用户就可以提交一段数据库查询的代码,根据程序返回的结果,获得一些敏感的信息或者控制整个服务器,于是SQL注入就发生了

本次实验首先分析漏洞的原理,接下来进行漏洞利用

实验步骤
步骤1:了解漏洞原理

本次漏洞产生的位置位于/ads/include/ads_place.class.phpshow方法中,漏洞代码如下:

function show($placeid)
...
if($adses[0]['option'])
{
foreach($adses as $ads)
{
$contents[] = ads_content($ads, 1);

$this->db->query(INSERT INTO$this->stat_table(`adsid`,`username`,`ip`,`referer`,`clicktime`,`type`)VALUES ($ads[adsid]','$_username','$ip',‘$this->referrer',$time',,'0')”);
$template = $ads['template'] ? $ads['template'] : 'ads';
}
}
...

可以看到,这里的$this->referrer通过this方法直接将HTTP请求头中的referer字段插入到数据库中,没有做任何过滤措施。

找到了漏洞的出处,接下来寻找包含漏洞的用户可控的页面。如果漏洞是用户不可控的,比如只能管理员利用,那就相对比较鸡肋了。

通过回溯法找到,在页面/ads/include/commom.inc.php 中调用了ads_place.class.php

<?php 
...
require MOD_ROOT.'include/ads_place.class.php';
require MOD_ROOT.'include/ads.class.php';
...
?>

继续回溯,发现在/ads/ad.php 中调用了/ads/include/commom.inc.php,ad.php文件为用户可控文件,但ad.php大多数情况下不能访问,因此继续向上查找。

发现了/data/js.php

<?php
chdir('../ads/');
require './ad.php';
?>

在用户访问首页时,会调用js.php,通过该文件可以提交有害字段,然后通过逐层调用,因此我们可以传入字段referer到危险方法show中,引入SQL注入攻击。

下一步我们进行利用操作

步骤2:漏洞验证

在漏洞介绍中,我们已经知道,因为模块取referer不严格,过滤不严谨,导致漏洞产生,因此我们这里就可以修改请求头中的referer,在本文中,我们直接使用火狐的插件Tamper 进行修改。

首先打开火狐浏览器,访问目标站点www.test.ichunqiu ,点击浏览器顶部的工具栏,选择Tamper ,打开后,我们点击左上角 Start Tamper 按钮启动它。

Alt text

接下来访问之前在分析漏洞中得出的网址:www.test.ichunqiu/data/js.php?id=1

Alt text

这时候,Tamper Data就会抓到当前访问的数据包:

注意:此处抓包网站要抓取正确,如图所示。

点击Tamper之前,将下面选项中的对勾要取消掉,这样它就不会抓取下面的包了,否则它会不停的弹出抓包提醒。

Alt text

接下来点击Tamper 即可查看数据包内容:

Alt text

可以看到我们并没有找到referer包,因此可以添加一个,并在内容里写入如下Payload:

referer=1', (SELECT 1 FROM (select count(*), concat(floor(rand(0)*2),char(45,45,45),(SELECT password from phpcms_member limit 1))a from information_schema.tables group by a)b), ‘0')#

这样通过SQL语句查询,就可以获取管理员账号密码。

点击空白处,选择第一个选项,Add element ,将Payload填写到输入框内:

Alt text

完成后,点击确定。

Alt text

可以看到,已经将referer添加进去,再次点击右下方的确定,让这个包发出去:

Alt text

成功获取后台管理员密码。

实验结果分析与总结

本次实验我们学习了通过构造执行恶意的SQL语句,查询数据库敏感信息的方法与原理,并学习了火狐浏览器插件Tamper Data的使用,掌握了如何抓取数据包,如何修改数据包,最终成功获取了数据库的敏感信息,那么如何修复SQL注入漏洞呢?

修复建议

  • 对相关字段进行过滤处理
  • 使用传参数方式进行数据库查询操作
  • 使用在线防护软件,如安全狗等
思考题目
  • 请在代码层次常识对这个漏洞进行修复
  • 如果网站有防护软件的守护,那么SQL语句改如何去构造?

1、以下哪些选项是对SQL注入漏洞的防护手段?()

  • 对相关字段进行过滤操作
  • 参数化查询数据库
  • 使用在线防护产品
  • 使用POST方式传递参数

ABC

2、在PHPCMS SQL注入漏洞中构造的payload是使用的以下哪种方法?()

  • insert插入
  • select查询
  • group by报错
  • update更新

C

3、以下哪个选项是PHPCMS中存在SQL注入漏洞的字段?()

  • Accept
  • Referer
  • User-Agent
  • X-Forwarded-For

B

4、以下哪个选项是SQL注入payload中#的作用?()

  • 闭合前面sql语句
  • 闭合后面sql语句
  • 注释前面sql语句
  • 注释后面sql语句

D

5、Web程序中出现以下哪种情况能形成漏洞?()

  • 可控变量进入正常函数
  • 可控变量进入危险函数
  • 不可控变量进入正常函数
  • 不可控变量进入危险函数

C

第1题:HTTP请求中,Referer代表____。

告诉服务器我是从哪个页面链接过来的

告诉服务器我的IP地址

告诉服务器我用的什么浏览器

告诉服务器我发送的数据是什么类型的

A

第2题:本次课程中如何将盲注转换成显示注入的。

使用联合查询

利用Group By 语句报错

利用返回时间差

利用白帽子的第六感

B

第3题:为什么访问的文件不是漏洞发生位置的文件?

随便访问的一个文件,并没有什么特殊意义

漏洞作者这么访问的

只有访问js.php才能把HTTP请求头中 X-Forwarded-For 的值传到目标函数中

漏洞发生的位置用户不可控,需要寻找用户可控的点,让危险变量进入危险函数

D

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值