bugku代码审计(上)

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() 函数从数组中将变量导入到当前的符号表。
该函数使用数组键名作为变量名,使用数组键值作为变量值。针对数组中的每个元素,将在当前符号表中创建对应的一个变量。
该函数返回成功设置的变量数目。
在这里插入图片描述
这里是默认覆盖
$_GET的变量是 $ f l a g flag flag 和 $ s h i y a n shiyan shiyan,所以flag会覆盖原本flag内容
则设flag为空或其他
在这里插入图片描述
在这里插入图片描述

strcmp比较字符串

<?php
$flag = "flag{xxxxx}";
if (isset($_GET['a'])) {
if (strcmp($_GET['a'], $flag) == 0) //如果 str1 小于 str2 返回 < 0; 如果 str1大于 str2返回 > 0;如果两者相等,返回 0。
//比较两个字符串(区分大小写)
die('Flag: '.$flag);
else
print 'No';
}
?>

strcmp函数需要传入字符串,数组不是字符串,所以用数组绕过
在这里插入图片描述

urldecode二次编码绕过

int eregi(string pattern, string string, [array regs]);
定义和用法
eregi()函数在一个字符串搜索指定的模式的字符串。搜索不区分大小写。Eregi()可以特别有用的检查有效性字符串
如果匹配成功返回true,否则,则返回false

<?php
if(eregi("hackerDJ",$_GET[id])) {
echo("

not allowed!

");
exit();
}
$_GET[id] = urldecode($_GET[id]);//输入是先把id编码了,现在再解码一次
if($_GET[id] == "hackerDJ")//解码后相等
{
echo "
Access granted!

";
echo "
flag

";
}
?>

所以输入编码后的id这样在第一个if不相等,解码后又相等了
不知道为什么在线编码hackerDJ不行,所以对着编码表,手动编码

http://123.206.87.240:9009/10.php?id=%68%61%63%6b%65%72%44%4a

md5()函数

<?php
error_reporting(0);
$flag = 'flag{test}';
if (isset($_GET['username']) and isset($_GET['password'])) {
if ($_GET['username'] == $_GET['password'])
print 'Your password can not be your username.';
else if (md5($_GET['username']) === md5($_GET['password']))
die('Flag: '.$flag);
else
print 'Invalid password';
}
?>

username不能等于password,都是两个md5加密后相等,若正常md5加密,不能做到,md5需要传入字符串,所以传入数组,两个结果都返回false,则相等
在这里插入图片描述

数组返回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';
}
?>

ereg(mode, string subject, array regs);
mode:正则表达式(preg_match中的mode必须以’/'开始和“/”结束)
subject: 需要验证的字符串
matchs/regs: 匹配后得到的结果。以数组的形式存储

strpos的语法
strpos(string,find,start)
string: 必需。规定被搜索的字符串。
find :必需。规定要查找的字符。
start: 可选。规定开始搜索的位置。
返回字符串在另一字符串中第一次出现的位置,如果没有找到字符串则返回 FALSE。注释: 字符串位置从 0 开始,不是从 1 开始。
^ [a-zA-Z0-9]+$
^限定开头
[a-zA-Z0-9]
匹配大写小写字母和数字其中一个字符
+
表示前面的匹配重复一到多次
$
结束符
题目要让password仅由大小写字母和数字又要包含符号’–‘时才有flag,是矛盾的,继续用数组处理,ereg和strpos都不能处理数组,所以
在这里插入图片描述
得到flag

弱类型整数大小比较绕过

$temp = $_GET['password'];
is_numeric($temp)?die("no numeric"):NULL;//判断变量temp是不是数字,die() 函数输出一条消息,并退出当前脚本
if($temp>1336){
echo $flag;

is_numeric判断是不是数字,是的话输出语句退出脚本,不是的话变量temp大于1336则输出flag
这也是一个矛盾
但是is_numeric()函数是弱类型,会把char型转换为int型比较
在这里插入图片描述
得到flag

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!

';
?>

var_dump() 函数显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。
这题就是name不等于password,但是这两个经过sha1()运算后相等,矛盾,又sha1函数不能处理数组
所以
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值