CTF Web 1

Web安全入门课后作业

level0 [极客大挑战 2019]Havefun

打开就发现一只猫,没有其他提示信息,于是查看源代码发现

由此可知,需要GET传参使其符合该要求,使用HackBar用GET方式传参

1
cat=dog

得到flag

level1 [RoarCTF 2019]Easy Calc

打开后,在表达式上线乱输一通,发现好像只有数字能被识别并正确计算,如果输入字母便会提示算不出来,于是查看一下源代码,发现线索。

找到一个叫calc.php文件,尝试访问看看。

分析代码,发现过滤了以上得的多种字符,于是先尝试Get传参?num=phpinfo()

发现行不通,于是尝试? %20num=phpinfo(),发现可以(php解析规则:当php进行解析时,如果变量名前面有空格,php会自动去掉前面的空格再进行解析,假如waf不允许num变量接收字母,那么使用 num就可以,而php解析时就会自动把空格去掉)

接着,使用scandir查看目录中的内容,找到存有flag的文件(由于“/“被过滤了,所以使用chr对/的ascii码进行转换绕过)

1
? num=var_dump(scandir(chr(47)))      /47对应的是"/"

绕过成功,发现一个f1agg的文件,依旧采用上面的方法去访问,将f1agg依次用ASCII码表述

1
? num=file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103))

得到flag

level2 [极客大挑战 2019]BuyFlag

打开是一个炫酷的页面,在这里乱翻找到

由此可知,我们需要是CUIT;然后还需要正确的密码。

第一步,用bp抓包,将Set-Cookie的user=0改成user=1

可以看到我们已经是Cuiter了,下一步就是密码了

查看一下源代码,发现有用的信息

分析代码,这道题注释的代码逻辑是要输入一个非纯数字的字符串且等于404,密码才能正确。(查了一下is_numeric()这个函数,他的作用是判断输入是否是数字的。如果是纯数字返回true,如果不是返回false。)

is_numeric函数对于空字符%00,无论是%00放在前后都可以判断为非数值,而%20空格字符只能放在数值后。所以,查看函数发现该函数对对于第一个空格字符会跳过空格字符判断,接着后面的判断。

因此,可以构造一个payload,404空格 这样的话is_numeric会判断成非数值,然后执行判断语句==404 ,进而得到flag。

成功了,不过它提醒我们要支付100000000去买flag,因此再多传一个money=100000000

真的服了这个老6,它有提示数字长度太长,网上查一下,发现用数组可以(是strcmp函数的锅。于是查一下这个函数的漏洞。发现只有在PHP5.3之前才有的漏洞。这个函数在数据类型不匹配的时候会返回0,也就是和比较成功的结果是一样的。因此只要传入非字符串类型就可以了。这里是传的数组。)

拿到flag

level3 [CISCN2019 总决赛 Day2 Web1]Easyweb

就给了个这样的页面,先看一下源代码看有没有提示信息

可能是我水平不够,不知道怎么利用这些信息,于是换个方向试试运气,用御剑扫描一下看看有没有其他东西

扫出来一个文件,打开,根据文件信息并结合源代码,尝试访问一下image.php.bak

下载下来一个文档,打开发现

又是折磨人的php,这里我也是参考了别人的wp

1
2
3
4
5
6
源码分析:
GET方式传入变量id的值,若没有则为1
GET方式传入变量path的值,若没有则为空
addslashes() 函数返回在预定义字符之前添加反斜杠的字符串,单引号(')、双引号(")、反斜杠(\)
str_replace()函数将两个变量内的\0、%00、\''都替换为空
将变量$id与$path拼接进SQL语句

也就是说,\\0在传入变量$id的值后,首先被转义为\0,再经过addslashes()函数的处理,变量$id="\\0",再由str_replace()函数的替换,最终变为\

有空继续解,未完待续。。。。。。


CTF Web 1
https://www.supersmallblack.cn/CTF-Web-1.html
作者
Small Black
发布于
2022年12月8日
许可协议