strcmp漏洞——[极客大挑战 2019]BuyFlag

文章目录

知识点

strcmp() 漏洞:

int strcmp ( string $str1 , string $str2 )

参数 str1 第一个字符串,str2 第二个字符串,如果 str1 小于 str2 返回 < 0; 如果 str1 大于 str2 返回 > 0;如果两者相等,返回 0。

可知,传入的期望类型是字符串类型的数据,但是如果我们传入非字符串类型的数据的时候,这个函数将会有怎么样的行为呢?实际上,当这个函数接受到了不符合的类型,这个函数将发生错误,但是在 php 5.3 之前,显示了报错的警告信息后,将 return 0,也就是说虽然报了错,但却判定其相等
 

is_numeric() 漏洞:

is_numeric() 函数对于空字符%00,无论是 %00 放在前后都可以判断为非数值,而 %20 空格字符只能放在数值后。所以,查看函数发现该函数对对于第一个空格字符会跳过空格字符判断,接着后面的判断!
 

解题

在 pay.php 界面可以看到给出的规则:只有 Cuit 的学生才能购买 FLAG;

F12看到源码:

<!--
	~~~post money and password~~~
if (isset($_POST['password'])) {
	$password = $_POST['password'];
	if (is_numeric($password)) {
		echo "password can't be number</br>";
	}elseif ($password == 404) {
		echo "Password Right!</br>";
	}
}
-->

password 等于404才能登录,但是 password 又不能是数字;

先用 BP 抓包,

显而易见,把 user 改成1,同时POST传入 password=404%20 试一下:

要付钱,因为这题的 Cookie 没有用上 PHPSESSID,那么这题猜一下逻辑就是直接将我们提交的 money 与要求的1000000比较,不存在记录的过程;

或者用科学计数法也是可行的:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sid10t.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值