BUUCTF WEB 个人做题记录(6-4)

8 篇文章 0 订阅
6 篇文章 0 订阅

目录

1.[RoarCTF 2019]Easy Calc 1

2.[极客大挑战 2019]PHP 1

3.[ACTF2020 新生赛]BackupFile 1

4.[护网杯 2018]easy_tornado 1

5.[极客大挑战 2019]BuyFlag 1


1.[RoarCTF 2019]Easy Calc 1

本题考点php字符串解析漏洞

先看看网站源码

 源码提示了WAF绕过和calc.php

bp抓包,看看从输入数值到计算出结果这个过程中发生了什么

 可以发先,但我们输入表达式计算的时候,访问了calc.php,num是我们在输入框中传入的参数

我们访问一下calc.php可以看到如下源码

 参考:(160条消息) BUUCTF [RoarCTF 2019]Easy Calc1_HongkongBoy的博客-CSDN博客

根据大佬的超详细解析:

 So 题目利用waf过滤了num参数中的一些字符,那么我们就需要利用php的字符串解析特性绕过waf,那么我们又来简单的了解下php的字符串解析特性。

PHP需要将所有参数转换为有效的变量名,因此在解析查询字符串时,它会做两件事:

     1.删除前后的空白符(空格符,制表符,换行符等统称为空白符);
     2.将某些字符转换为下划线(包括空格);
     例:假如waf不允许num变量传递字母, 那么我们可以在num前加个空格,这样waf就找不到num这个变量了,因为现在的变量叫" num",而不是"num"。但php在解析的时候,会先把空格给去掉,这样我们的代码还能正常运行,还上传了非法字符。
 

 由于该题num参数过滤了一些字符,所以我们需要在参数num前添加空格绕过waf

构造参数? num=phpinfo()(注意num前面有个空格)就能够绕过,并执行phpinfo()函数。

由鉴于他过滤了单引号和双引号,我们无法直接传参。
需要用到几个函数来构建取得目录:
var_dump() — 可以将变量的内部信息打印出来,可以打印出数组
scandir() — 传入目录参数,返回传入目录的文件及文件夹
chr() — 传入数字可以将ASCII码解析为字符串
readfile() — 传入文件名作为参数可以读取文件内容
file_get_contents — 传入文件名作为参数可以读取文件内容
 

47对应ASCII为/,所以chr(47)表示"/";故构造?%20num=1;var_dump(scandir(chr(47))),取得目录对应文件及文件夹名字如下图,一般flag都在根目录下;
思路有了,下面附上截图:

可以看到上面我们在根目录下发现了flagg文件,下面用readfile读取文件,flagg转换成chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)的形式,payload:

calc.php?%20num=1;var_dump(readfile(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))

readfile只是读取文件的一种方式,其他的还有很多,大家自行百度,如果要改变读取方式只需把对应的函数替换即可

2.[极客大挑战 2019]PHP 1

打开发现

 扫描工具扫一下,发现有www.zip目录,访问后把对应的文件下载下来,这里说一下,如果你的扫描工具扫不到,试着在配置文件里加上/www.zip,保存后重启软件再扫一下

 

 先看一下:index.php

 GET 方式提交一个select参数,变量res=反序列化后的select的参数值

class.php

 要求username===admin,passwd==100,由前面的index.php我们想到把Name()类序列化赋值给select变量,再看看flag.php,但是注意这里有个魔术方法__wakeup

 没看到有价值的东西,下面按照前面得到信息对Name类进行序列化

前面的分析我们知道存在waf绕过,

在本题的关键,就是username的赋值 因为 __wakeup 会对userneme进行一次赋值,所以我们要想办法绕过该函数, 并且在一开始我们要改变 username的赋值

当成员属性数目大于实际数目时可绕过wakeup方法,payload:

O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";s:3:"100";}

原来的成员属性为2,这里我们改为3,图片里的白色方框转化成它对应的ur编码%00,因为GET方式提交的参数如果含有特殊字符一般不会自动解析,所以我们这里要手动替换,然后访问即可:

3.[ACTF2020 新生赛]BackupFile 1

看到这个页面,我第一个想到的就是.git源码泄露,但是githack扫了半天,什么也没扫到。那就直接dirsearch扫(御剑的话!唉,我对它很失望,以后遇到要扫描目录的,我都直接dirsearch了,虽然时间长了点,但扫得彻底)

还是有发现的,访问一下 ,把对应的文件下载下来就是源码了

 源码提示我们要传入一个key参数,is_numeric判断是否为数字,这里要求一定要为数字,再把key参数的值和str字符串进行弱类型比较,弱类型=比较的话我们str是123(字符串最前面的数字部分),我们直接令key=123即可

 

4.[护网杯 2018]easy_tornado 1

网站打开,发现三个目录,一个一个地看

 

首先/flag.txt,提示flag在 /fllllllllllllag目录下

在看一下/welcom.txt,发现一个render,这个render是python的tornator框架下的一个渲染函数,这个后面在介绍

 再看一下/hinit.txt,提示了flag的形式,就是把cookie_secret+md5( /fllllllllllllag)再进行一次md5加密,这个cookie_secret也是tornator框架里的一个。。。,后面再说

 网站内容的解读大致就是这样,要做这题就要先知道tornator是什么,这部分参考:(165条消息) [33]python Web 框架:Tornado_周小董的博客-CSDN博客_python tornado

VUE推荐在绝大多数情况下使用template来创建我们的HTML。然而在一些场景中,我们真的需要JavaScript的完全编程的能力,这就是render函数,它比template更接近编译器。
render方法的实质就是生成template模板;
而render又是tornado里面的一个函数,这个函数肯定是有问题的
通过查阅Tornado官方文档我们知道
Tornado提供了一些对象别名来快速访问对象。Handler指向的处理当前这个页面的RequestHandler对象
handler是RequestHandler的别名
而RequestHandler.settings是self.application.settings的别名。
所以handler.settings就等于RequestHandler.application.settings。
这个self是oneself的意思,哪个对象用就是哪个对象的.application.settings。
所以最后就是cookie_secret在RequestHandler.application.settings里
用handler.settings访问RequestHandler.application.settings


下面我们找注入点,我们直接访问网站的项目列表,像这样:

根据报错我们知道注入点就是msg参数,我们通过msg={{hanler.settings}}来查看cookie_secret的值

 然后按照之前网站的提示,把cookie_secret:dd5c2699-5753-4c3a-8a58-48f2157c0f48加/fllllllllllllag的md5:3bf9f6cf685a6dd8defadabfb41a03a1,得到:dd5c2699-5753-4c3a-8a58-48f2157c0f483bf9f6cf685a6dd8defadabfb41a03a1,对其进行md5加密即得flag:flag{988c638aa99d2d62dc3d916cbc307e83}

5.[极客大挑战 2019]BuyFlag 1

网站打开,提示我们必须是这个学校的学生而且还要回答正确的密码才能买flag,当然还需要足够的钱

 

我们直接bp抓包,

改一下

现在满足了第一个条件,再看看这个password是什么,这个再网站的源码里可以找到

 

 其实就是要我们用传入一个参数password,password不能是数字而且要和404相等,其实就是一个弱类型比较,令password=404a

 

 第二步已经完成,接下来就是这个money了,这个money使用strcmp进行匹配,下面是大佬的解释

php中的strcmp漏洞
说明:
int strcmp ( string $str1 , string $str2 )
参数 str1第一个字符串。str2第二个字符串。如果 str1 小于 str2 返回 < 0; 如果 str1 大于 str2 返回 > 0;如果两者相等,返回 0。

可知,传入的期望类型是字符串类型的数据,但是如果我们传入非字符串类型的数据的时候,这个函数将会有怎么样的行为呢?实际上,当这个函数接受到了不符合的类型,这个函数将发生错误,但是在5.3之前的php中,显示了报错的警告信息后,将return 0。

我们把money变为一个数组,后面的值为任意,即可绕过,像下面这样:

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值