[SWPUCTF 2021 新生赛]gift_F12
打开题目是一个时间页面,不过看了一会儿发现没有什么用
直接F12打开网页源代码
Ctrl+F搜索flag
找到了flag
NSSCTF{We1c0me_t0_WLLMCTF_Th1s_1s_th3_G1ft}
[第五空间 2021]签到题
NSSCTF{welcometo5space}
[SWPUCTF 2021 新生赛]jicao
打开题目发现是一段代码
解读:
包含了flag.php文件,设定了一个POST请求的id和GET请求的json
语句会对GET请求的数据进行json解码
如果id和json变量的值都等于设定字符串,那么就打印flag
JSON
JSON对象是一种存储数据的方式,它使用键值对的形式表示数据。
在JSON中,键是一个字符串,值可以是字符串、数字、布尔值、数组、嵌套的JSON对象或null。JSON对象的语法规则如下:
下面是一个JSON对象的示例:
{
"name": "John",
"age": 30,
"isStudent": false,
"interests": ["reading", "traveling"],
"address": {
"city": "New York",
"country": "USA"
},
"phoneNumber": null
}
在上面的示例中,name、age、isStudent、address、phoneNumber都是键,对应的值分别是字符串、数字、布尔值、嵌套的JSON对象、null。
你可以使用各种编程语言(如JavaScript、Python、PHP等)来创建、访问和操作JSON对象。
NSSCTF{43cc5241-889f-4ca6-b9b5-1cf4641510e6}
关于MD5绕过
一:强类型与弱类型比较
松散比较也就是弱类型比较,严格比较就是强类型比较
a==b:弱类型比较会将a和b转成统一数据类型在进行比较,而强类型比较会先判断a和b是不是相同类型,不是,则返回false,是,再比较a和b的值。
二:类型
1)弱比较(==):
例子:
<?php
highlight_file(__FILE__);
error_reporting(0);
$flag = "flag{H3rmesk1t_is_a_loser}";
$val1 = $_GET['val1'];
$val2 = $_GET['val2'];
if (isset($_GET['val1']) and isset($_GET['val2']))
{
if ($_GET['val1'] != $_GET['val2'])
{
if ((md5($_GET['val1']) == md5($_GET['val2'])))
echo $flag;
else
echo "you can't get flag";
}
}
?>
<?php
highlight_file(__FILE__);
error_reporting(0);
$flag = "flag{H3rmesk1t_is_a_loser}";
$val1 = $_GET['val1'];
$val2 = $_GET['val2'];
if (isset($_GET['val1']) and isset($_GET['val2']))
{
if ($_GET['val1'] != $_GET['val2'])
{
if ((md5($_GET['val1']) == md5($_GET['val2'])) and (md5(md5($_GET['val2'])) == md5(md5($_GET['val1']))))
echo $flag;
else
echo "you can't get flag";
}
}
?>
PHP转换规则
字符串和数字比较使用==时,字符串会先转换为数字类型再比较,若字符串以数字开头,则取开头数字作为转换结果,不能转换为数字的字符串(例如"aaa"是不能转换为数字的字符串,而"123"或"123aa"就是可以转换为数字的字符串)或null,则转换为0。
方法一:数组绕过
上面的例题:
md5不能加密数组,会返回null
方法二:科学计数法绕过(0e)
在php中,0e开头的数字会当作科学计数法解析,不管后面的值为任何东西,0的任何次幂都为0
只要是以0e开头,后面为数字的字符串和字符串0比较值都是相等的,因为不管0不论和多少相乘都是0。
例如:
(1)
(2)
(3)
代码审计:要求get获取的a和b的值要求不相等,但要求其md值相同
2)强比较(===):
注意:强比较不能使用0e来绕过
(因为强类型比较,不仅比较值,还比较类型,0e会被当做字符串,所以不能用0e来进行,但是我们可以用MD值完全相同的字符来进行绕过)
方法一:数组绕过
与弱比较的方法相同
方法二:使用md5加密后两个完全相等的两个字符串绕过
二进制md5加密 ecd33e3e09ff2a58e1d9ed7189dc186b
url编码 abc%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%D6%16y%AC%CE%C5%A1LrY5fn%94%10%D9%01%C3%AC%F8%AAN%21%D0%27%BE%3Ej%A7%22%0C%D08%D3%AF%DFRo%2F%A4%8B%E8%EB45j%E4h%9C%21%22%AB%7E%BC%8E%7C%17%9E%C3Xg%D7%A8%CDHt%BE%AB.%2FWb%3Eb%EA%FC%261%0F_%3D%AFo%3F%1E%DE%E8i%86%7D%BF%C7_Q%CDA%B4%CF%B8n%06Ir%7F%5C%A3k%F9%2AO%DFF%2A%F3%8BcH%FF%85%3F%0D%D0%9B%C7%C8-%12%92
二进制md5加密 ecd33e3e09ff2a58e1d9ed7189dc186b
url编码 abc%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%D6%16y%AC%CE%C5%A1LrY5fn%94%10%D9%01%C3%ACx%AAN%21%D0%27%BE%3Ej%A7%22%0C%D08%D3%AF%DFRo%2F%A4%8B%E8%EB45%EA%E4h%9C%21%22%AB%7E%BC%8E%7C%17%9E%C3%D8g%D7%A8%CDHt%BE%AB.%2FWb%3Eb%EA%FC%261%0F_%3D%AFo%BF%1E%DE%E8i%86%7D%BF%C7_Q%CDA%B4%CF%B8n%06Ir%7F%5C%A3k%F9%2A%CF%DEF%2A%F3%8BcH%FF%85%3F%0D%D0%9BG%C8-%12%92
3)特定条件下的MD验证绕过:ffifdyop
Select * from ’admin’ where password=md5($pass,true)
首先要知道md($pass,true)的含义:
MD5报文将以原始 16字符二进制格式返回
ffifdyop 字符串经过MD5加密后为276f722736c95d99e921722cf9ed621c
在转换成字符串为’or’6乱码
Select * from ’admin’ where password=‘or’6乱码
相当于万能密码
例题:
一:[SWPUCTF 2021 新生赛]easy_md5(Nssctf)
进入题目,有一段代码
代码审计:这里需要让password 不等于 name ,但是又需要让他们的md5值相等,所以我们需要md5绕过
我们使用hackbar传入参数
法一:数组绕过
可以使用[]类型比较的方法,由于md5()函数存在缺陷,加密[]的时候返回值是NULL这样子的话就能够成功的绕过
法二:使用0e(科学计数法绕过)
同样的使用hacker工具进行传参
二:[SWPUCTF 2022 新生赛]奇妙的MD5(Nssctf)
神秘的字符串就是ffifdyop,根据函数md5加密后,再次转换为字符串时,会变成’or’6 。进入第二关。源码里面有东西。
输入ffifdyop,点击提交查询
进入了这个界面
查看源代码:
代码审计:就是要x和y的值不相等,但是MD5值要相等
payload:?x[]=1&y[]=2
在url中输入这个payload
发现Url多出一个后台,访问一下
NSSCTF{83d24a46-9206-4793-afa3-f92aab660de7}