前言
Vulhub是一個基於docker和docker-compose的漏洞環境集合,進入對應目錄並執行一條語句即可啓動一個全新的漏洞環境,讓漏洞復現變得更加簡單,讓安全研究者更加專注於漏洞原理本身
Voulhub靶機平臺環境搭建和使用:
https://blog.csdn.net/qq_41832837/article/details/103948358
漏洞原理
Nginx在反向代理站點的時候,通常會將一些文件進行緩存,特別是靜態文件。緩存的部分存儲在文件中,每個緩存文件包括“文件頭”+“HTTP返回包頭”+“HTTP返回包體”。如果二次請求命中了該緩存文件,則Nginx會直接將該文件中的“HTTP返回包體”返回給用戶。
如果我的請求中包含Range頭,Nginx將會根據我指定的start和end位置,返回指定長度的內容。而如果我構造了兩個負的位置,如(-600, -9223372036854774591),將可能讀取到負位置的數據。如果這次請求又命中了緩存文件,則可能就可以讀取到緩存文件中位於“HTTP返回包體”前的“文件頭”、“HTTP返回包頭”等內容。當Nginx服務器使用代理緩存的情況下,攻擊者通過利用該漏洞可以拿到服務器的後端真實IP或其他敏感信息。
漏洞詳情
影響版本:Nginx version 0.5.6 - 1.13.2
漏洞原因:是由於對http header中range域處理不當造成。主要代碼是ngx_http_range_parse函數中的循環:
for(;;) {
start = 0;
end = 0;
suffix = 0:
while (*p == '') { p++;}
if (*p !='-'){
if(*p<'0'||*p>'9'){
return NGX_HTTP_RANGE_ NOT_ SATISFIABLE;
while(*p>='0'&&*p<='9'){
if (start >= cutoff && (start > cutoff II *p - '0' > cutlim)) {
return NGX_ HTTP_ RANGE_ NOT_ SATISFIABLE;
start = start *10 + *p++ -'0';
}
while (*p == '') { p++; }
if (*p++ != '-') {
return NGX_ HTTP_ RANGE_ NOT_ SATISFIABLE ;
}
while(*p==' '){p++;}
if(*p==','|| *p=='\0'){
end = content_ length;
goto found;
}
} else {
suffix = 1;
p++;
}
if (*p<'0'll*p>'9') {
return NGX_ HTTP RANGE NOT_ SATISFIABLE;
}
while(*p>='0'&&*p<='9'){
if (end >= cutoff && (end > cutoff II *p - '0' > cutlim)) {
return NGX_ HTTP_ RANGE_ NOT_ SATISFIABLE;
}
end=end*10+*p++-'0';
}
while(*p==' '){p++;}
if(*p!=','&&*p!='0'){
return NGX_ HTTP_ RANGE_ NOT_ SATISFIABLE;
}
if (suffix) {
start = content_ length - end;
end = content_ length - 1;
}
if (end >= content_ _length) {
end = content_ length;
} else {
end++ ;
}
found :
if (start < end) {
range = ngx_ array_ push( &ctx- >ranges);
if (range == NULL) {
return NGX_ ERROR;
}
range- >start = start;
range- >end = end;
size += end - start;
if (ranges-- ==0) {
return NGX_ DECLINED;
}
if (*p++ != ',') {
break ;
}
}
瞭解到HTTP頭部range域的表示方式是:bytes=<start>-<end>
範圍大概是: bytes=4096-8192,字符串指針p的內容即爲bytes的範圍。
這段代碼是要把“-”兩邊的數字取出分別賦值給start和end變量,標記讀取文件的偏移和結束位置。
也就是說bytes=<start>-<end>
這個範圍內讀取到的是緩存文件內容本身。假如這個緩存文件是有文件頭,把start設置成負數呢?很好理解,那麼它讀取的位置就會往前面移動,導致文件頭的信息也會被讀取出來。
好啦知道原理後開始我們復現過程,在此感謝大牛們提供的poc。
漏洞復現
找到該路徑下的poc.py直接利用即可python ./poc.py http://192.168.232.135:8080
讀取返回結果:
可見,越界讀取到了位於“HTTP返回包體”前的“文件頭”、“HTTP返回包頭”等內容。
如果讀取有誤,請調整poc.py中的偏移地址
也可以用github上的另一個腳本:
https://github.com/en0f/CVE-2017-7529_PoC
END
每天積累一點點,終究有一天爆發出來強大的力量。我是jammny,喜歡的點個贊!加個關注吧!持續更新vulhub漏洞復現系列。