首页 电脑 电脑学堂 查看内容

编写用于自动挖掘WEB漏洞的php fuzzer

2009-6-15 10:58 445 0

摘要: 文章作者:未知译文作者:riusksk(泉哥:http://riusksk.blogbus.com)来源:邪恶八进制信息安全团队注:原文出自国外著名黑客杂志《Hack This Zine》 &nbs...
关键词: nbsp 恶意 错误 漏洞 error http host URL array flags

文章作者:未知译文作者:riusksk(泉哥:http://riusksk.blogbus.com)来源:邪恶八进制信息安全团队注:原文出自国外著名黑客杂志《Hack This Zine》       Fuzzers是一项用于代码审计以及系统漏洞探测的工具。本文主要使用php脚本编写一些用于fuzz测试URL中GET参数的函数,以引发错误,从而发现潜在的漏洞。接着再探讨一下功能扩展的可行性,以打造更为全面的web漏洞审计工具。这个web fuzzer是通过修改URL中的每个GET参数来进行测试工作的,它主要通过组合各种可能会引发错误的恶意字符来替代GET参数的。现在考虑一下下面一些常见的请求,这些请求经常可以触发一些错误,从而发现漏洞。 //恶意WEB请求$vulnchars[0] = array("%00","%2527%252esasdf","%u0000","%u5c00%u2700","/","../","./..././","/%2e/", "%2e","%5C","%s", "'","'''''","\"","%%%%%%","!!!!!!!!!!!!!!!!!!","#", "%5C27","%%5C%56" , "\'", "\\",';',";a", "|","\?>", "%a0"); //恶意SQL请求$vulnchars[1] = array(" OR 1=1", "' OR '!'='!"); //恶意XSS请求$vulnchars[2] = array("javascript:alert(String.fromCharCode(65,66,67))","<script>alert('cookies, yo: ' + document.cookie);</script>"); 接下来,我们先构造一切可能组合的WEB请求,并分析一下输出结果。经扫描后可以得到一系列可触发错误代码输出的请求,并产生一个“flagged”URL列表,以便过后作进一步的审计。下面列出一些常见的WEB,SQL及XSS错误语句:$flags[0] = array("<b>warning</b>:", "warning:", "<b>fatal error</b>", "failedto open stream:", "internal server error", "there was an error when processingthis directive.", "http/1.1 400", "http/1.1 403", "http/1.1 500", "gatewayerror", "command not found", "file not found");$flags[1] = array("[obdc", "mysql error", "you have an error in your sqlsyntax", "odbc drivers error", "[microsoft sql", );$flags[2] = array("javascript:alert(string.fromcharcode(65,66,67))","<script>alert('cookies, yo: ' + document.cookie);</script>"); 既然我们已经知道了应该构造何种请求以及返回的输出结果,那么我们就可以编写一份用于构造恶意请求的PHP代码来查询HTTP服务器了。在本例中,我们只构造了GET请求,但你若想构造其它的HTTP请求方式也是很容易修改得到的。 function MakeRequest($url, $method="GET") {  $url = str_replace(" ", "%20", $url);  if ($method=="GET") {    $host = substr($url, strpos($url, "://") + 3);$host=substr($host,0,strpos($host, "/"));  $request = substr($url, strpos($host, "/"));  $fp = @fsockopen($host, 80, $errno, $errstr, 10);  if (!$fp) {     echo "    ERROR . $url $errstr ($errno)$newline";  } else {     $out  = "GET $request HTTP/1.1\r\n";     $out .= "Host: $host\r\n";     $out .= "Connection: Close\r\n\r\n";     fwrite($fp, $out);     while (!feof($fp)) {         $buf.= fgets($fp);     }     fclose($fp);    }  }   return $buf;} 通过恶意构造的请求,我们就可以获取HTTP服务器返回的结果,接下来我们就需要利用一个函数来扫描上面列表中的错误代码了。如果变量$result中有与$flags数组元素相符合的内容,则下列函数返回结果为真。 function TestResult ($result) {  global $flags;  $result = strtolower($result);  for ($i=0;$i < count($flags);$i++) {    for ($o=0;$o < count($flags);$o++) {      if (!(strpos($result, $flags[$i][$o]) === false)) {        return 1;      }    }  }  return 0;} 万事俱备,只欠东风!现在该是我们编写代码的时候了,以便将这一切都联系起来。下列代码使用$lists数组来包含所有用于检测的URL地址。首先测试分析包含各种GET参数的URL,并循环测试各种可能组合并且惟一的URL地址,然后利用每个GET参数来尝试各种恶意字符串,同时可以使用其它GET参数的默认值。对于数组$list中URL地址的请求次数应该在N^N个左右,这里N是指每个URL地址中的GET参数个数。接下来调用MakesRequest()函数请求每个唯一的URL地址,并利用Test Result()函数来检查返回的结果是否与$flag数组中的错误语句相匹配。 for ($inc=0;$inc<count($list);$inc++) {   if ($localonly == true AND (substr($list[$inc], 0, 17) !="http://localhost/" AND substr($list[$inc], 0, 17) != "http://127.0.0.1/"))die("Sorry, this script can only be tested against localhost.");   // SetUpParameters用于分析URL地址中的每个GET参数,并将其存储在数组$get和$getvalues中    $url = SetUpParameters($list[$inc]);   if (trim($url) != "") {    echo "$newline$url$newline";      // 测试每一种可能的漏洞   for ($vulni=0;$vulni<count($vulnchars);$vulni++) {  switch ($vulni) {    case 0: echo "  * General web vulnerabilities$newline"; break;    case 1: echo "  * SQL vulnerabilities$newline"; break;    case 2: echo "  * XSS vulnerabilities$newline"; break;  }  // 检测URL地址中的每一个GET参数  for ($o=0;$o < count($get);$o++) {    for ($i=0;$i<count($vulnchars[$vulni]);$i++) {   // 通过漏洞字符表构造各个URL地址   $whichparam = $get[$o];   $testing = $url . "?";   // 组合脚本中所有其它参数的默认值   for ($z=0;$z<count($get);$z++) {     if ($get[$z] != $whichparam)$testing.="&".$get[$z]."=".$getvalue[$z];   }   $testing .= "&" . $whichparam . "=" . $vulnchars[$vulni][$i];       $fun = MakeRequest($testing);   if ($parseforlinks == true) ParseForLinks($fun);   $error = TestResult($fun);   if ($error != 0)      echo "    FLAG! .. $testing$newline";     if ($error == 0 and $verbose == true)       echo "    OK    .. $testing $newline";      }    }     }   }} 这段代码是编写一个web GET请求测试工具fuzzer必不可少的内容,通过添加其它特殊功能就可以打造一个功能更为全面的WEB审计工具了。首先可以编写一份脚本用于读取URL请求的输出结果,并以<a href="http://$host/">标志的形式添加到数组$list中。另外也可以添加其它请求方式,比如POST,SSL,cookie以及文件上传漏洞。编写一个web fuzzer是一项很值得去做的编程工作,但可能也是项没完没了的工作。
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

最新评论

返回顶部