[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对象。
键和值之间使用冒号 : 分隔。
每个键值对之间使用逗号 , 分隔。
键必须是一个字符串,需要用双引号或单引号括起来。
值可以是字符串、数字、布尔值、数组、嵌套的JSON对象或null。
下面是一个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对象。
所以我们传入
GET json={"x":"wllm"}
POST id= wllmNB
NSSCTF{43cc5241-889f-4ca6-b9b5-1cf4641510e6}
关于MD5绕过
一:强类型与弱类型比较
松散比较也就是弱类型比较,严格比较就是强类型比较
a==b:弱类型比较会将a和b转成统一数据类型在进行比较,而强类型比较会先判断a和b是不是相同类型,不是,则返回false,是,再比较a和b的值。
也就是== 和 ===的区别
php中其中两种比较符号:
==:先将字符串类型转化成相同,再比较
===:先判断两种字符串的类型是否相等,再比较
二:类型
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。
方法一:数组绕过
上面的例题:
payload:?val1[]=1&val2[]=2
md5不能加密数组,会返回null
例如:
a=_GET['a'];
b=_GET['b'];
md5(a)==md5(b)
payload:?a[]=1&b[]=2
方法二:科学计数法绕过(0e)
在php中,0e开头的数字会当作科学计数法解析,不管后面的值为任何东西,0的任何次幂都为0
只要是以0e开头,后面为数字的字符串和字符串0比较值都是相等的,因为不管0不论和多少相乘都是0。
QNKCDZO
0e830400451993494058024219903391
s878926199a
0e545993274517709034328855841020
s155964671a
0e342768416822451524974117254469
s214587387a
0e848240448830537924465865611904
s214587387a
0e848240448830537924465865611904
s878926199a
0e545993274517709034328855841020
例如:
(1)
a=_GET['a'];
b=_GET['b'];
md5(a)==md5(b)
payload:?a=QNKCDZO&b=240610708
(2)
a=_GET['a'];
a==md5(a);
payload:?a=0e215962017
(3)
if ($_GET['a'] != $_GET['b'])
{
if (md5(_GET\['a'\]) == md5(_GET['b']))
echo '1';
else
echo '0';
}
else echo "请输入不同的a,b值";
payload:?a=QNKCDZO&b=240610708
代码审计:要求get获取的a和b的值要求不相等,但要求其md值相同
- 以下是一些字符串md5值以0e开头
QNKCDZO
240610708
s878926199a
s155964671a
s21587387a
2)强比较(===):
注意:强比较不能使用0e来绕过
(因为强类型比较,不仅比较值,还比较类型,0e会被当做字符串,所以不能用0e来进行,但是我们可以用MD值完全相同的字符来进行绕过)
方法一:数组绕过
与弱比较的方法相同
方法二:使用md5加密后两个完全相等的两个字符串绕过
例如:
a=_GET['a'];
b=_GET['b'];
md5(a)===md5(b)
payload:?a=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2&b=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2
二进制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多出一个后台,访问一下
继续数组绕过
这次是post传参方式
paylaod:?wqh[]=1&dsy[]=2
NSSCTF{83d24a46-9206-4793-afa3-f92aab660de7}