代码审计实例-XDcms SQL注入

分析目标
XDcms订餐网站系统  v1.0
XDcms订餐网站管理系统,主要使用Php+Mysql+Smarty技术基础进行开发,采用OOP(面向对象)方式进行基础运行框架搭建,集成在线订 餐、团购、积分商城、优惠券、新闻、在线订单、在线支付、生成订单短信/邮箱通知、点评、Google电子地图、问答、并与支付宝、Dz论坛、短信平台接 口完美整合等功能于一体的完全开源的高级订餐网站管理系统。作为国内最受欢迎的PHP类订餐网站系统之一,XDcms在不断提升用户服务、提高产品质量的 同时更加注重用户体验。从系统研发至今,历经了数百次的更新修改后,网站的架设与管理变得更加轻松及便捷。
官网:http://www.xdcms.cn/

正文:

1001

一次在看别人的审计文章中看到了这个cms,挺简单的一个注入,然后我自己也去把这cms最新版下载下来看看。

原始漏洞发生位置:

1002

还是补掉了嘛,intval()转换成整形了。

然后自己再去看看有其他的洞没。

看了会看到了这个文件:

systemmodulesmemberindex.php

内容如下:

1003

$username通过 post[‘username’]来获得。

然后经过safe_html函数的过滤就带入了下面的查询中。

1004

看调用的这个过滤函数,过滤得不好,大小写参数未指定,而且替换成空。
我是用的第一种,我看那人是用的第二种。

调用的mysql类里面的num_rows。

1005

查询出来了然后只要让

提交后提示:

1006

提示会员存在了。

因为这个就是用来查询是否存在的,查询出来了数据就提示会员存在了。
然后准备用sqlmap 来Post注入。

1007

1008

level 设置高点 虽然是找到了payload 但是跑不出来数据。
这是因为Num_rows 只会返回影响了多少多少行数据。

1009

感觉好像就是返回这个,所以就不能跑出数据把。
来报错注入把。

但是过滤掉了*和=,1=1还可以用2>1来,替换count(*) 替换成 count(1) 依旧也能报错,但是rand(*) 这个我不知道怎么搞了。

换一个报错语句把。

1010

ok。
经过laterain的教导,第一个语句其实也可以不用*

1011

我看的是member/index.php,别人是看的后台index.php。唉,我就没看到后台绕过了。
后台拿SHELL

顺便说说后台拿shell

1013
我看那个文章还更新了下,说他并没有研究出后台拿shell。我自己也就去看了下 我也没去研究后台插配置那些,他说的是模版只能替换html的文件。确实只能编辑已有的文件,而且也只能是html文件,连 htm都不能。

尝试替换根目录下的index.php

1012

替换php不行 只能html 怎么办呢?
截断它把!

1013

1014

拿到shell后 要给Index.php 复原。

要不站点就会挂的。

而且也最好不替index.php  如果你的马儿不免杀,被杀掉的话index.php就没了,这个站也就挂了。
大家找找哪个文件没什么用就替换哪个把。
这就是替换后的效果。

1015

[via@]