【转载】伪静态SQL注入

伪静态,主要是为了隐藏传递的参数名,伪静态只是一种URL重写的手段,既然能接受参数输入,因此并不能防止注入。目前来看,防止注入的最有效的方法就是使用LINQ。常规的伪静态页面以下:http://www.2cto.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实现方法:


代码
//伪静态方法一

// localhost/php100/test.php?id|1@action|2
$Php2Html_FileUrl = $_SERVER["REQUEST_URI"];
echo $Php2Html_FileUrl.”
”;// /php100/test.php?id|1@action|2
$Php2Html_UrlString = str_replace(“?”,”",str_replace(“/”, “”, strrchr(strrchr($Php2Html_FileUrl, “/”),”?”)));
echo $Php2Html_UrlString.”
”;// id|1@action|2
$Php2Html_UrlQueryStrList = explode(“@”, $Php2Html_UrlString);
print_r($Php2Html_UrlQueryStrList);// Array ( [0] => id|1 [1] => action|2 )
echo “
”;
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 “
”;
$_GET[$Php2Html_TmpArray[0]] = $Php2Html_TmpArray[1];
}
//echo ‘假静态:$_GET变量
’;
print_r($_GET); // Array ( [id|1@action|2] => [id] => 1 [action] => 2 )
echo “
”;
echo “”;
echo $_GET[id].”
”;// 1
echo $_GET[action];// 2
?>

代码
//伪静态方法二

// localhost/php100/test.php/1/2
$filename = basename($_SERVER[''SCRIPT_NAME'']);
echo $_SERVER[''SCRIPT_NAME''].”
”;// /php100/test.php
echo $filename.”
”;// test.php

if(strtolower($filename)==’test.php’){
if(!empty($_GET[id])){
$id=intval($_GET[id]);
echo $id.”
”;
$action=intval($_GET[action]);
echo $action.”
”;
}else{
$nav=$_SERVER[''REQUEST_URI''];
echo “1:”.$nav.”
”;// /php100/test.php/1/2
$script=$_SERVER[''SCRIPT_NAME''];
echo “2:”.$script.”
”;// /php100/test.php
$nav=ereg_replace(“^$script”,”",urldecode($nav));
echo $nav.”
”; // /1/2
$vars=explode(“/”,$nav);
print_r($vars);// Array ( [0] => [1] => 1 [2] => 2 )
echo “
”;
$id=intval($vars[1]);
$action=intval($vars[2]);
}
echo $id.’&’.$action;
}
?>

代码
//伪静态方法三

function mod_rewrite(){
global $_GET;
$nav=$_SERVER["REQUEST_URI"];
echo $nav.”
”;
$script_name=$_SERVER["SCRIPT_NAME"];
echo $script_name.”
”;
$nav=substr(ereg_replace(“^$script_name”,”",urldecode($nav)),1);
echo $nav.”
”;
$nav=preg_replace(“/^.ht(m){1}(l){0,1}$/”,”",$nav);//这句是去掉尾部的.html或.htm
echo $nav.”
”;
$vars = explode(“/”,$nav);
print_r($vars);
echo “
”;
for($i=0;$i
$_GET["$vars[$i]“]=$vars[$i+1];
}
return $_GET;
}
mod_rewrite();
$year=$_GET["year"];//结果为’2006′
echo $year.”
”;
$action=$_GET["action"];//结果为’_add’
echo $action;
?>

代码
//伪静态方法四

//利用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.2cto.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验证的基本没见过,大概这就是差距吧,先写到这里吧,等有时间了写一个完整的关于伪静态注入和检查方法!!!提权内容待续(若是能成功提权的话!)php

 

------------伪静态注入,尚无经验,体会回写:2013.8.27html

相关文章
相关标签/搜索