0×00 靶場連結
http://123.206.87.240:8002/web10/
0×01 題目描述
0×02 解題過程
<?php
highlight_file('2.php');
$key='KEY{********************************}';
$IM= preg_match("/key.*key.{4,7}key:\/.\/(.*key)[a-z][[:punct:]]/i", trim($_GET["id"]), $match);
if( $IM ){
die('key is: '.$key);
}
?>
preg_match(要搜尋的模式,字元串,參數) 該函數在字元串裡搜尋符合 要搜尋的模式的 字元,并傳回給參數
例子
trim(字元串,字元) 移除字元串兩側的空邊字元或其他預定義字元
再來看正規表達式
/key.*key.{4,7}key:\/.\/(.*key)[a-z][[:punct:]]/i
. 比對除”\n”之外的任何單個字元
* 比對它前面的表達式0次或多次,等價于{0,}
{4,7} 最少比對4次,最多比對7次,結合前面的.也就是比對4到7個任意字元
\/ 比對”/”,這裡的”\”是為了轉義
[a-z] 比對所有小寫字母
[:punct:] 比對任何标點符号
/i 表示不分大小寫
總體來說,id傳參,符合正規表達式,key就會顯示,需要自行構造payload
具體解讀:
//i是總限定,//是定界符,限定的條件都在定界符裡,i不用區分大小寫
/key首先就是需要有key三個字母,不一定需要key打頭,像?id=key也是可以的
/key.* 這裡的.可以比對任何字元,随便什麼都可以,而*表示比對前面的字母0次或者多次,是以可以選擇幾個字母或者不填,如?id=keyaaa
/key.*key多了一個key,,是以加上key,即?id=keyaaakey
/key.*key.{4,7} 代表任意比對一個字元并且出現4-7次,是以這裡需要有4-7個重複的字母,即?id=keyaaakeyaaaa
/key.*key.{4,7}key: 和前面多出來的key一樣,我們需要再加上key: 即?id=keyaaakeyaaaakey:
/key.*key.{4,7}key:\/.\/ \代表了轉義,是以/不再代表界定符,而是直接看成/./ .又代表任意字元比對,是以寫?id=keyaaakeyaaaakey:/a/
/key.*key.{4,7}key:\/.\/(.*key) .*還是一樣,随便寫幾個字母,寫一個算了?id=keyaaakeyaaaakey:/a/akey,
/key.*key.{4,7}key:\/.\/(.*key)[a-z] [a-z]是比對一個小寫字母?id=keyaaakeyaaaakey:/a/akeya
/key.*key.{4,7}key:\/.\/(.*key)[a-z][[:punct:]] [[:punct]]是比對标點符号, ?id=keyaaakeyaaaakey:/a/akeya?
KEY{0x0SIOPh550afc}
可行答案如下:
?id=keykeyaaaakey:/;/akeya?
?id=keykeyaaaakey:/;/keya?