天天看點

web——字元?正則?(100)——Bugku

0×00 靶場連結

http://123.206.87.240:8002/web10/

0×01 題目描述

web——字元?正則?(100)——Bugku
web——字元?正則?(100)——Bugku

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(要搜尋的模式,字元串,參數) 該函數在字元串裡搜尋符合 要搜尋的模式的 字元,并傳回給參數

例子

web——字元?正則?(100)——Bugku

trim(字元串,字元) 移除字元串兩側的空邊字元或其他預定義字元

web——字元?正則?(100)——Bugku

再來看正規表達式

 /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?

web——字元?正則?(100)——Bugku

KEY{0x0SIOPh550afc}

可行答案如下:

?id=keykeyaaaakey:/;/akeya?

?id=keykeyaaaakey:/;/keya?

繼續閱讀