Buuctf Web(17-20)

Buuctf Web(17-20)

17、BackupFile

题目名称叫备份文件,直接用dirsearch扫描:py -3.9 http://2677258c-1c01-46a9-9f37-cef51bea8534.node4.buuoj.cn:81/ -e php

响应成功的

image

image

image

访问/index.php.bak文件,下载下来了

image

查看文件,如果key=123ffwsfwefwf24r2f32ir23jrw923rskfjwtsw54w3,输出flag

image

如果直接构造payload:/?key=123ffwsfwefwf24r2f32ir23jrw923rskfjwtsw54w3

显示只要数字

image

==是弱相等,所以当key=123时,就会输出flag

构造payload:/?key=123

得到flag

image

1
flag{7e29466e-c1e3-4679-8eda-80c196664fe2}

18、Easy Calc

查看源代码,没看到啥

抓包,发现一个calc.php文件

image

查看该文件,有一个黑名单

image

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

查看源码,$(“#content”).val()相当于 document.getElementById(“content”).value;

image

PHP的字符串解析特性

尝试一下/calc.php?num=phpinfo()

image

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

加个空格

image

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

image

构造:/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)))

得到flag

image

1
flag{21d2d1ed-ae60-4490-a8b0-0f712482f7cd}

19、BuyFlag

查看源代码,发现有两个php文件链接,点击一个查看

image

点击右边的菜单,有PAYFLAG,点击查看

image

出现这段话

image

查看源代码,用POST的方式传参,money=100000000,password=404,但是password不能为数字,所以password等于404+任意字符

image

前面提示必须是cuit的学生,所以修改cookie里的user=0user=1

修改uesr=0为user=1,页面变了,提示输入password

image

post传参,password=404a&money=100000000,提示数字太长

image

尝试次方 1e9,得到flag

image

1
flag{2eaf1e59-0556-4816-b343-80a3466e934e} 

20、Easy MD5

查看源代码,找不到有用的信息,抓包

看到有一个提示:Hint: select * from 'admin' where password=md5($pass,true)

image

1
2
3
4
5
6
7
8
9
10
11
md5(string,raw)

string 必需,规定要计算的字符串。

raw 可选,规定十六进制或二进制输出格式: TRUE - 原始 16 字符二进制格式;FALSE - 默认。32 字符十六进制数

需要构造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

image

提交

image

查看源代码

image

用get传参,满足a!=b且md5(a)=md5(b)

md5加密后的值开头为0E,则说明它们的值相等

payload:/levels91.php?a=s878926199a&b=s155964671a

image

包含flag.php文件

用post传参,满足param1!=param2且md5(param1)=md5(param2)

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

param1[]=1&param2[]=2

得到flag

image

1
flag{5699128f-b8b5-4580-9e90-8ab95639eb15}