BY:似曾相识
伪静态,主要是为了隐藏传递的参数名,伪静态只是一种URL重写的手段,既然能接受参数输入,所以并不能防止注入。目前来看,防止注入的最有效的方 法就是使用LINQ。常规的伪静态页面如下:http://www.XXX.com/play/Diablo.html, 在看到之前先要确定这个页面是静态还是伪静态,鉴别方法很多。
例如关联的动态页面是game.php ,那么当用户访问后程序会自动转换成类似http://www.XXX.com/game.php?action=play& name=Diablo 的形式,当然这部分是PHP执行的所以在访问时看不到。假如name=Diablo这个参数有注入点但是访问的是伪静态页面,那么注入的语句其实差不多, 不过如果是MYSQL数据库是不能用注释符的,因 为注释的斜杠会被当成目录访问,那么就会出现问题,所以这里的注入需要把语句补全。
注入点检测可以用:http://www.XXX.com/play/Diablo’ and 1=’1.html与http://www.XXX.com/play/Diablo’ and 1=’2.html来判断,联合查询我也试过,不过失败了。我用的语句如下:http://www.XXX.com/play/diablo’ and 1=2 union select 1,2… from information_schema.columns where 1=’1.html,但是测试了N次都不能成功,有可能程序的SQL语句后面还有其他条件,具体原因没仔细看。
所以这个时候只能用盲注来检测,不过因为伪静态注入的URL比较特殊,一般的注入工具是利用不了的,所以就把刺猬写的COOKIES注入中转器的 get方式注入的代码修改了一下,只要把注入的参数写成Diablo ,然后在提交的语句后面加上.html那么就可以直接放到穿山甲里注入了。
注入的速度就看中转的速度了,感觉用低版本的穿山甲效果更好,高版本有可能因为速度比较快所以在猜解字母的时候会导致部分内容检测不到。为了更好的解释伪静态,先看看四种伪静态的php实现方法:
代码
<?php
//伪静态方法一
// localhost/php100/test.php?id|1@action|2
$Php2Html_FileUrl = $_SERVER["REQUEST_URI"];
echo $Php2Html_FileUrl.”<br>”;// /php100/test.php?id|1@action|2
$Php2Html_UrlString = str_replace(“?”,”",str_replace(“/”, “”, strrchr(strrchr($Php2Html_FileUrl, “/”),”?”)));
echo $Php2Html_UrlString.”<br>”;// id|1@action|2
$Php2Html_UrlQueryStrList = explode(“@”, $Php2Html_UrlString);
print_r($Php2Html_UrlQueryStrList);// Array ( [0] => id|1 [1] => action|2 )
echo “<br>”;
foreach($Php2Html_UrlQueryStrList as $Php2Html_UrlQueryStr)
{
$Php2Html_TmpArray = explode(“|”, $Php2Html_UrlQueryStr);
print_r($Php2Html_TmpArray);// Array ( [0] => id [1] => 1 ) ; Array ( [0] => action [1] => 2 )
echo “<br>”;
$_GET[$Php2Html_TmpArray[0]] = $Php2Html_TmpArray[1];
}
//echo ‘假静态:$_GET变量<br />’;
print_r($_GET); // Array ( [id|1@action|2] => [id] => 1 [action] => 2 )
echo “<br>”;
echo “<hr>”;
echo $_GET[id].”<br>”;// 1
echo $_GET[action];// 2
?>
代码
<?php
//伪静态方法二
// localhost/php100/test.php/1/2
$filename = basename($_SERVER['SCRIPT_NAME']);
echo $_SERVER['SCRIPT_NAME'].”<br>”;// /php100/test.php
echo $filename.”<br>”;// test.php
if(strtolower($filename)==’test.php’){
if(!empty($_GET[id])){
$id=intval($_GET[id]);
echo $id.”<br>”;
$action=intval($_GET[action]);
echo $action.”<br>”;
}else{
$nav=$_SERVER['REQUEST_URI'];
echo “1:”.$nav.”<br>”;// /php100/test.php/1/2
$script=$_SERVER['SCRIPT_NAME'];
echo “2:”.$script.”<br>”;// /php100/test.php
$nav=ereg_replace(“^$script”,”",urldecode($nav));
echo $nav.”<br>”; // /1/2
$vars=explode(“/”,$nav);
print_r($vars);// Array ( [0] => [1] => 1 [2] => 2 )
echo “<br>”;
$id=intval($vars[1]);
$action=intval($vars[2]);
}
echo $id.’&’.$action;
}
?>
代码
<?php
//伪静态方法三
function mod_rewrite(){
global $_GET;
$nav=$_SERVER["REQUEST_URI"];
echo $nav.”<br>”;
$script_name=$_SERVER["SCRIPT_NAME"];
echo $script_name.”<br>”;
$nav=substr(ereg_replace(“^$script_name”,”",urldecode($nav)),1);
echo $nav.”<br>”;
$nav=preg_replace(“/^.ht(m){1}(l){0,1}$/”,”",$nav);//这句是去掉尾部的.html或.htm
echo $nav.”<br>”;
$vars = explode(“/”,$nav);
print_r($vars);
echo “<br>”;
for($i=0;$i<Count($vars);$i+=2){
$_GET["$vars[$i]“]=$vars[$i+1];
}
return $_GET;
}
mod_rewrite();
$year=$_GET["year"];//结果为’2006′
echo $year.”<br>”;
$action=$_GET["action"];//结果为’_add’
echo $action;
?>
代码
<?php
//伪静态方法四
//利用server变量 取得PATH_INFO信息 该例中为 /1,100,8630.html 也就是执行脚本名后面的部分
if(@$path_info =$_SERVER["PATH_INFO"]){
//正则匹配一下参数
if(preg_match(“/\/(\d+),(\d+),(\d+)\.html/si”,$path_info,$arr_path)){
$gid =intval($arr_path[1]); //取得值 1
$sid =intval($arr_path[2]); //取得值100
$softid =intval($arr_path[3]); //取得值8630
}else die(“Path:Error!”);
//相当于soft.php?gid=1&sid=100&softid=8630
}else die(‘Path:Nothing!’);
?>
代码
PHP防注入,主要是为了防止恶意写入后台数据库;
//防注入函数
function inject_check($sql_str){
$check=eregi(‘select|insert|update|delete|\’|\/\*|\*|\.\.\/|\.\/|union|into|load_file
|outfile’, $sql_str);
if($check){
echo ” 输入非法内容”;
exit();
}else{
return $sql_str;
}
}
//接收传递参数后进行转换
$_GET[type]=inject_check($_GET[type]);
//之后再使用转换后的参数
之前写的这篇关于伪静态注入的文章,写的比较简单基本上只算是对伪静态注入的方法和原理做了简单介绍,很多细节方面的东西都没有提到,不过要纠正一 点,伪 静态注入一样可以用联合查询的,只是具体的字段数要一个一个猜,这个有点麻烦,今年主要在看老美的网站,发现很多伪静态站点都有注入点,只是大部分注入点 都比较隐蔽所以在渗透的时候需要花费很多时间,这里就以美国某游戏站点的渗透作为实例,介绍一下整个渗透利用过程。
前段时间比较无聊,上了某游戏站点放松,发现那个站做的很不错而且在线人数达到1W多,因为我是在白天访问的当时美国应该是晚上,所以可以看出这个 站的流量非常大,去alexa上查了一下排名在4千左右,流量25W,那么这个站流量估计有50W+,看了口水都留下来了!!!随即打算检测一下这个网站 的安全性,访问了整个网站只有2个页面是调用PHP的,但是没有注入点,整个网站大致信息如下:APACHE、PHP、数据库未知(应该是MYSQL 吧)、伪静态页面(检查后发现的)、后台找不到、不能破解目录(访问不存在的页面或目录后会返回首页,状态码始终是200和301,扫描的时候会有很多误 报)、可以注册(没有注入点)、不能上传文件、没有常见的配置漏洞(比如目录浏览之类的)、没有扫到冗余文件、没有FTP、没有SSH、端口扫描后也没有 发现。似乎这个网站很棘手,毕竟别人也是排名4K内的站啊!!!在GG、baidu上搜了一下PHP以及敏感的页面也没新发现,其实有时候用百度搜国外站 的收录页会有惊喜哦!因为这个站是伪静态的,所以对主要的几个页面做了伪静态的注入测试,但是都没漏洞,也不知道这个网站是用什么模版做的。用旁注工具扫 了一下域名,发现服务器上绑定了十几个站,悲剧的是所有站用的是同一个网站模版,所有情况和主站一样。估计到这里很多人都想到C段吧,可惜老外的IDC比 较怪,一般不会把一个C放在一个交换机环境里,我碰到最BT的是把子网掩码设为255.255.255.252,稍微好点的是 255.255.255.244,就算弄到同网段的,一般都是LINUX服务器,提权超难,公布的0day基本都不行,所以C段直接放弃。
关注入点继续回到网站上,注册了一个账号,看了一下用户功能,基本上只有修改自己信息的权限,COOKIES方面测试了一下没漏洞,不过发现网站管 理 员的账号和注册人员是同一个表的,把URL里的ID改一下就能获得用户名,可惜只有用户名,而且用户名还很BT,哎!!!!难啃的骨头,继续深入~~~~ 看到游戏页面后找到一个投票的连接,抓包后发现也是伪静态(连接类型如下:http://www.XXXXX.com/vote/5453/1), 通过伪静态的注入点检测确定存在注入漏洞并且提交后会执行update语句,检测时提交以下语句(http://www.XXXXX.com/vote /5453′/1 报错,http://www.XXXXX.com/vote/5453-0/1 返回正常游戏名字 http://www.XXXXX.com/vote/5453-1/1 返回5452的游戏名字,判断存在注入点)连接的表是member,可惜显示的出错语句很复杂,各种符号都有,想了几种办法也都没补全,而且数据库中的表 和列也都不知道,似乎只有看源码后才能构造注入语句,鸡肋的注入点,余下来看完了整个网站也只发现一个暴物理路径的漏洞,又是鸡肋!似乎初步的检查到这步 已经完成了,一个字,难!
因为弄到很晚所以睡觉了,隔了几天还是时不时的上来看看网站、看看管理员在线状态,一个星期后觉得很不爽,再次打开这个网站,然后把注册页面、登陆 页面、提交页面作为关键字去网上找相同模版,这次终于有发现了,找到一个新部署的网站,而且后台路径是admin管理员账户是默认的admin,进去后发 现后台可以直接拿SHELL,然后去网上查了一下这个网站的0day,但是比较老所以无法利用,看了一下源码也只发现那个鸡肋的注入点,这个时候忽然想到 了什么,通过上传的SHELL查看数据库的表结构,原来member的表中有一个管理员的选项,设为1就是普通用户,设为2就是管理员,这样就能通过那个 注入点提升权限了,而且在php页面中看到了投票的SQL语句,在构造之后直接在游戏站上测试(语句如下:http://www.XXXXX.com /vote/5453;}’,xxx=’xxx’,xxx=’{xxxx/1), 成功提升为管理员(经过验证发现只要用这个网站模版都可以提权,又一个0day!),而且发现只要账户具有管理权限,前台页面中会以×××显示用户名,狂喜 之下登陆游戏站,发现在用户界面中多了一个管理员登录的选项,可是!!!悲剧再次发生,连接的目录是默认路径,后台找不到,是在不甘心用平时用的后台扫描 字典,以及自己生成了1-5位的数字以及字符的字典放到havij里爆破,因为havij可以DIY状态代码,所以我把200和301的状态去掉了,扫了 3天后无果!!!!纠结!!!!
在1个星期之后的某天再次打开这个网站,用一个网上下的字典再次扫了整个目录,这次发现在根目录里有一个server-status,访问之后狂 喜,里面有APACHE提供当前服务的URL,所以用户访问的页面都能检查,然后找了website watch进行监控,设置了一些关键字后以平均每3秒钟对该页面检测一次,如果发现有关键字就以MAIL方式报警,同时把有关键字的页面覆盖在邮件中,2 天后成功抓到后台页面,打开后发现是401验证,网站没有下载和FL漏洞,用获取的管理员信息尝试登陆,结果统统失败,感觉脑子都充血了!!!!对了,不 是还有UPDATE权限的鸡肋注入点吗!!由于MYSQL的关系,无法把同表中的内容更新到同表的其他列中,所以第一次失败了,上网查了一下重新构造语句 成功,拿到的是管理员md5的密码,上CMD5上查到源码,然后用管理员的账户通过了401验证,成功登陆后台,进去后随便逛了一下上传 webshell,反弹cmdshell,发现是X64的系统,用了网上找的道的所有EXP都不能提权,不过发现服务器上有2个外网IP,另外一个IP可 以链接FTP和SSH,用了管理员的密码以及passwd里的用户名登陆结果发现网管用了公钥验证,RSA加密,直接访问存放public key的目录显示DENY,直接下载公钥还是DENY,不过可以看所有网站目录。
到这步基本上网上入侵成功了,可是还没提权,不过把管理员的用户名放到GG上搜了一下发现到处都有他的”足迹”,而且都不能用他的密码登陆,只能社 工和跟踪了,看来又是一个漫长的提权过程,整个网站入侵从开始到拿到权限大致用了2个月时间,等有时间了就想办法提权,谢了稍微多了一点,其实伪静态注入 的利用价值还是很高的,而且结合其他鸡肋的安全问题可以直接威胁到网站甚至服务器的安全,相比之下国内站台烂了,即时LINUX有了WEBSHELL 80%都可以提权,用public key做SSH验证的基本没见过,大概这就是差距吧,先写到这里吧,等有时间了写一个完整的关于伪静态注入和检查方法!!!提权内容待续(如果能成功提权 的话!)
ps:不错的文章,亮点颇多,很久没看到渗透测试的好文章了,从手法来看,作者的经验与思路达到一定水平。文章中的几个工具也挺实用,我找到的下载地址:
http://www.crsky.com/soft/8573.html WebSite-Watcher v4.41 授权汉化版
http://itsecteam.com/fa/projects/project1.htm Havij v1.1
WebSite-Watcher可以用的地方应该挺多的,暂时只想到在一般情况可用来监视http站的密码记录文件,比如xss或者sniffer的密码记录文件,还有长期监视网站目录文件结构变化,可定义一些关键字,看看有没有新机会。
Havij是个具有sql注入、web结构扫描功能的工具,有些站点访问不存在的页面就会转到(302)自定义错误页面,会导致很多扫描器会误报。它这个可以自定义http请求返回状态码以及文件后缀。