nssctf(Web刷题)

[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}

相关推荐
罔闻_spider21 分钟前
爬虫----webpack
前端·爬虫·webpack
吱吱鼠叔23 分钟前
MATLAB数据文件读写:1.格式化读写文件
前端·数据库·matlab
爱喝水的小鼠40 分钟前
Vue3(一) Vite创建Vue3工程,选项式API与组合式API;setup的使用;Vue中的响应式ref,reactive
前端·javascript·vue.js
CCTV果冻爽1 小时前
Android 源码集成可卸载 APP
android
WeiShuai1 小时前
vue-cli3使用DllPlugin优化webpack打包性能
前端·javascript
ice___Cpu1 小时前
Linux 基本使用和 web 程序部署 ( 8000 字 Linux 入门 )
linux·运维·前端
JYbill1 小时前
nestjs使用ESM模块化
前端
加油吧x青年1 小时前
Web端开启直播技术方案分享
前端·webrtc·直播
秋月霜风2 小时前
mariadb主从配置步骤
android·adb·mariadb
吕彬-前端2 小时前
使用vite+react+ts+Ant Design开发后台管理项目(二)
前端·react.js·前端框架