每天一道ctf

一.[RoarCTF 2019]Easy Calc

 查看页面源代码

抓包

发现calc.php,访问一下

 有个黑名单

chr() 函数:从指定的 ASCII 值返回字符。 ASCII 值可被指定为十进制值、八进制值或十六进制值。八进制值被定义为带前置0,而十六进制值被定义为带前置 0x。
file_get_contents() 函数:把整个文件读入一个字符串中。该函数是用于把文件的内容读入到一个字符串中的首选方法。如果服务器操作系统支持,还会使用内存映射技术来增强性能。
PHP的字符串解析特性:PHP需要将所有参数转换为有效的变量名,因此在解析查询字符串时,它会做两件事:1.删除空白符 2.将某些字符转换为下划线(包括空格)【当waf不让你过的时候,php却可以让你过】。假如waf不允许num变量传递字母,可以在num前加个空格,这样waf就找不到num这个变量了,因为现在的变量叫“ num”,而不是“num”。但php在解析的时候,会先把空格给去掉,这样我们的代码还能正常运行,还上传了非法字符。
scandir() 函数:返回指定目录中的文件和目录的数组。

查看源码 

PHP的字符串解析特性
尝试一下/calc.php?num=phpinfo()

PHP的字符串解析特性:PHP需要将所有参数转换为有效的变量名,因此在解析查询字符串时,它会做两件事:1.删除空白符 2.将某些字符转换为下划线(包括空格)【当waf不让你过的时候,php却可以让你过】。假如waf不允许num变量传递字母,可以在num前加个空格,这样waf就找不到num这个变量了,因为现在的变量叫“ num”,而不是“num”。但php在解析的时候,会先把空格给去掉,这样我们的代码还能正常运行,还上传了非法字符。 

num前加个空格:/calc.php? num=phpinfo()

 由于“/”被过滤了,所以我们可以使用chr(47)来进行表示,进行目录读取:
calc.php? num=1;var_dump(scandir(chr(47)))

构造:/flagg——chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)
payload:calc.php? num=1;var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))

二.[极客大挑战 2019]BuyFlag

 查看源码

 代码审计:以post方式传参,money=100000000,password满足等于404,但是不能为数字,所以password等于404+任意字符
使用burpsuite抓包

总结一下需要满足四个条件:前面提示必须是cuit的学生;以post方式传参;money=100000000;password=404a。

所以修改cookie里的user=0为user=1

 password=404a&money=100000000

 这里提示数字太长
password=404a&money=1e9

 得到flag

三.[护网杯 2018]easy_tornado

首先出来三个链接

 查看flag.txt
提示flag在/fllllllllllllag中
知道了第一个条件,filename=/fllllllllllllag
查看welcome.txt

查看hints.txt

分析一下

这里有两个参数,第一个参数filename,文件的名称,我们通过查看flag.txt文件知道,藏flag的文件名为fllllllllllllag;第二个参数filehash,翻译一下:文件哈希,也就是加密了

加密方法在第三个文件中md5(cookie_secret+md5(filename)),将cookie_secret+filename的值md5加密后的值,整体再md5加密;然后把最后的值赋给filehash

现在最重要的一步就是获取cookie_secret的值

在试的过程中,尝试只输入filename的值而忽略filehash,结果出来以下内容,URL变成/error?msg=Error

前面忽视了第二个文件内容render 

render是python中的一个渲染函数,也就是一种模板,通过调用的参数不同,生成不同的网页 ,如果用户对render内容可控,不仅可以注入XSS代码,而且还可以通过{{}}进行传递变量和执行简单的表达式。
Tornado是一种 Web 服务器软件的开源版本。Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。

由于是python的一个模板,首先想到的就是模板注入{{}},最终找到的位置是报错网页(随便访问一个文件是更改它的签名就可以进入),里面的参数msg。
render是模板注入,经过测试发现过滤了。构造payload:/error?msg={{1*2}}

 

在tornado模板中,存在一些可以访问的快速对象,这里用到的是handler.settings,handler指向RequestHandler,而RequestHandler.settings又指向self.application.settings,所以handler.settings就指向RequestHandler.application.settings了,这里面就是我们的一些环境变量

构造payload    /error?msg={{handler.settings}}


找到cookie_secret为cbb6f44c-da94-4078-a392-2e4173f36618

 filename的值md5加密后为3bf9f6cf685a6dd8defadabfb41a03a1
cookie_secret+filename加密后的值为9ff081746c35f525a315a313ac1a00d8
构造payload:/file?filename=/fllllllllllllag&filehash=9ff081746c35f525a315a313ac1a00d8

四. [BJDCTF2020]Easy MD5

查看源代码没有什么发现,抓包看一看 

 线索暗示:Hint: select * from 'admin' where password=md5($pass,true)

md5(string,raw)

现在需要构造or来绕过password,md5(ffifdyop,true)='or'6\xc9]\x99\xe9!r,\xf9\xedb\x1c
原sql查询语句则变为select * from user where username ='admin' and password =''or'6\xc9]\x99\xe9!r,\xf9\xedb\x1c'即可绕过
类似的字符串还有:md5(129581926211651571912466741651878684928,true)=\x06\xdaT0D\x9f\x8fo#\xdf\xc1'or'8
在输入ffifdyop后,出现

查看源码

 

这里就需要知道一个知识点:md5加密后的值开头为0E是他们的值相等
/levels91.php?a=s878926199a&b=s155964671a
出现以下提示 

我们访问levell14.php 

这里用php数组绕过,由于哈希函数无法处理php数组,在遇到数组时返回false,我们就可以利用false==false成立使条件成立。
param1[]=1&param2[]=2 

五. [HCTF 2018]admin

这里有两个选项,点击register注册一个新账户
在这里插入图片描述

下面这就算是登进来了

 

 查看源码

提示you are not admin,可能需要登录admin才能获取我们想要的东西

试一下弱口令,用户名admin,密码123

得到flag 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值