bugku—— 代码审计 做题记录
目录
1,extract变量覆盖
2,strcmp比较字符串
3,urldecode二次编码绕过
4,md5()函数
5,数组返回NULL绕过
6,弱类型整数大小比较绕过
7,sha()函数比较绕过
8,md5加密相等绕过
9,十六进制与数字比较
10, 变量覆盖
11,ereg正则%00截断
12,strpos数组绕过
13,数字验证正则绕过
1,extract变量覆盖
入口给了一段php代码:
<?php
$flag='xxx';
extract($_GET); if(isset($shiyan)) { $content=trim(file_get_contents($flag)); if($shiyan==$content) { echo'flag{xxx}'; }else { echo'Oh.no'; }
}
?>
题目分析:URL 通过 get 的方式传参,传输的数据以数组的形式被封装在$_GET 中;extract()函数从数组中将变量导入到当前的符号表,该函数使用数组键名作为变量名,使用数组键值作为变量值;isset()函数判断是否存在变量$shiyan
;trim()函数移除字符串两侧的空白字符或其他预定义字符 ,这里是移除字符串两侧的空格;file_get_contents()函数将整个文件读入一个字符串;假如$shiyan
的值等于文件的内容($content
)时,就打印出flag
我们要做的 就是 通过GET 方式传入 $shiyan 使 它的值等于 文件的内容 $content
最初的想法是 利用 extract() 的变量覆盖 传入 $shiyan 然后在利用个 php弱类型
只传入 ?shiyan=0 发现不行
只能同时传入 shiyan 和 flag 了使 读取文件错误 就会试 $content 的值为 布尔的0
传入
?shiyan=&flag=
得到flag:
flag{bugku-dmsj-p2sm3N}
extract变量覆盖:
extract() 函数从数组中将变量导入到当前的符号表。该函数使用数组键名作为变量名,使用数组键值作为变量值。针对数组中的每个元素,将在当前符号表中创建对应的一个变量。该函数返回成功设置的变量数目。
将键值 “Cat”、”Dog” 和 “Horse” 赋值给变量 $a
、$b
和 $c
:
<?php
$a = "Original";
$my_array = array("a" => "Cat","b" => "Dog", "c" => "Horse");
extract($my_array);
echo "$a = $a; $b = $b; $c = $c";
?>
运行结果为:
$a = Cat; $b = Dog; $c = Horse
在通过 get 和 post方法进行覆盖已有变量时 的前提:register_global=ON
2,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';}
?>
代码大意是: 通过get传入 变量 a 如果 变量 a 的和字符串比较 相同的话 就输出flag:
这里利用的是 strcmp() 函数的漏洞:函数期望的是 比较两个字符串,但是如果我们比较的是 数组 和 字符串 就会出错 ,但会判定为相等
传入:
//随便传入一个数组就行
?a[]=2
得到flag:
flag{bugku_dmsj_912k}
3,urldecode二次编码绕过
eregi()函数在一个字符串搜索指定的模式的字符串。搜索不区分大小写
<?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()函数在一个字符串搜索指定的模式的字符串。搜索不区分大小写。Eregi()可以特别有用的检查有效性字符串,如密码。可选的输入参数规则包含一个数组的所有匹配表达式,他们被正则表达式的括号分组。
返回值:如果匹配成功返回true,否则,则返回false
使用eregi()函数来判断,所以参数中不能直接有hackerDJ
,获取参数后使用urldecode对id的值进行解码,所以可以让id解码后的值是hackerDJ进行url编码后的值,由于浏览器会自行解码一次,所以编码两次就好
解题方法:
(在进行编码时,默认字母是不进行编码的,urlencode 编码的原理就是 将字符的ascii 码转化为 16进制 再加上%
,所以我们只需要将 化成16进制形式,再每两位加%,然后将得到的结果 再进行编码)
GET请求:?id=%25%36%38%25%36%31%25%36%33%25%36%62%25%36%35%25%37%32%25%34%34%25%34%61
4,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()函数不能处理数组,所以构造:
?username[]=2&password[]=3
5,数组返回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);elseecho 'Invalid password';
}
?>
看到ereg()就联想到 %00截断 、处理数组返回null
截断:
?password=123%00--
数组:
?password[]=123--
但是:
ereg只能处理字符,而你是数组,所以返回的是null,三个等号的时候不会进行类型转换。所以null不等于false。strpos的参数同样不能够是数组,所以返回的依旧是null,null不等于false也是正确
6,弱类型整数大小比较绕过
$temp = $_GET['password'];
is_numeric($temp)?die("no numeric"):NULL;
if($temp>1336){
echo $flag;
要求:password 不是一个数字,但其值 大于1336
这里利用 php 弱类型 在 进行 字符串 和 数字比较时会先将 字符串转化为 数字
?password=78966fd
还可以构造数组:
php中很多函数都不能处理数组,is-numeric()也一样 ,还有就是 数组与数字比较大小时,永远判定数组大于 数字(不确定)
?password[]=1
也正确了
7,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);elseecho 'Invalid password.';
}
elsecho 'Login first!';
?>
var_dump()格式化输出
漏洞 :sha1() 函数不能处理 数组 处理数组时会返回 null
构造:
7.php?name[]=1&password[]=2
8,md5加密相等绕过
<?php
$md51 = md5('QNKCDZO');
$a = @$_GET['a'];
$md52 = @md5($a);
if(isset($a)){
if ($a != 'QNKCDZO' && $md51 == $md52) {
echo "flag{*}";
} else {
echo "false!!!";
}}
else{echo "please input a";}
?>
要求: 传入 变量 a ,a不等于 QNKCDZO 但要使 a md5加密后 的值 跟 QNKCDZO加密后的值相等
漏洞: md5() 绕过 , QNKCDZO 加密后是:0e830400451993494058024219903391 在php处理时会被认为是 科学计数法 即结果是 0
那我们再构造一个 加密后是 0e开头的字符串就行了
?a=s878926199a0e545993274517709034328855841020
附上MD5漏洞总结:https://blog.csdn.net/vhkjhwbs/article/details/97618629
9,十六进制与数字比较
<?php
error_reporting(0);
function noother_says_correct($temp){$flag = 'flag{test}'; $one = ord('1'); //ord — 返回字符的 ASCII 码值 $nine = ord('9'); //ord — 返回字符的 ASCII 码值 $number = '3735929054'; // Check all the input characters! for ($i = 0; $i < strlen($number); $i++) {// Disallow all the digits! $digit = ord($temp{$i});if ( ($digit >= $one) && ($digit <= $nine) ) {// Aha, digit not allowed! return "flase"; } } if($number == $temp) return $flag;
}
$temp = $_GET['password'];
echo noother_says_correct($temp);?>
要求:
传入的参数password 前十位 不能是 1~9,并且 等于 3735929054
漏洞: 十六进制 在与数字比较时 会被自动先化为 十进制
这里 数字 3735929054的 16进制是 :0xdeadc0de (注意 这里3735929054是个数字而不是一个字符串)
?password=0xdeadc0de
10变量覆盖
11,ereg正则%00截断
<?php
$flag = "xxx";
if (isset ($_GET['password']))
{if (ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE){echo 'You password must be alphanumeric';}else if (strlen($_GET['password']) < 8 && $_GET['password'] > 9999999){if (strpos ($_GET['password'], '*-*') !== FALSE) //strpos — 查找字符串首次出现的位置{die('Flag: ' . $flag);}else{echo('- have not been found');}}else{echo 'Invalid password';}
}
?>
利用 ereg() %00截断 上边做过类似的题,不再赘述!
?password=9e9%00*-*
或者利用 strlen(),strpos(),ereg()函数不能处理数组 ,并且 在 用 === 时 null 不等于 false
?password[]=1
12,strpos数组绕过
<?php
$flag = "flag";
if (isset ($_GET['ctf'])) { if (@ereg ("^[1-9]+$", $_GET['ctf']) === FALSE) echo '必须输入数字才行'; else if (strpos ($_GET['ctf'], '#biubiubiu') !== FALSE) die('Flag: '.$flag); else echo '骚年,继续努力吧啊~'; } ?>
利用 ereg()和 strpos()函数不能处理数组 并且 在 === 或 !== 情况下 null 不等于 false
?ctf[]=1
13,数字验证正则绕过
<?php
error_reporting(0);
$flag = 'flag{test}';
if ("POST" == $_SERVER['REQUEST_METHOD'])
{
$password = $_POST['password'];
if (0 >= preg_match('/^[[:graph:]]{12,}$/', $password)) //preg_match — 执行一个正则表达式匹配
{
echo 'flag';
exit;
}
while (TRUE)
{
$reg = '/([[:punct:]]+|[[:digit:]]+|[[:upper:]]+|[[:lower:]]+)/';
if (6 > preg_match_all($reg, $password, $arr))
break;
$c = 0;
$ps = array('punct', 'digit', 'upper', 'lower'); //[[:punct:]] 任何标点符号 [[:digit:]] 任何数字 [[:upper:]] 任何大写字母 [[:lower:]] 任何小写字母
foreach ($ps as $pt)
{
if (preg_match("/[[:$pt:]]+/", $password))
$c += 1;
}
if ($c < 3) break;
//>=3,必须包含四种类型三种与三种以上
if ("42" == $password) echo $flag;
else echo 'Wrong password';
exit;
}
}
?>
分析:[:graph:] 可打印的非空白字符
if (0 >= preg_match('/^[[:graph:]]{12,}$/', $password)) 如果password 不是12字符以上 就输出字符 ‘flag’并退出
$reg = '/([[:punct:]]+|[[:digit:]]+|[[:upper:]]+|[[:lower:]]+)/';
if (6 > preg_match_all($reg, $password, $arr)) 如果password中被匹配的组数小于6,就停止
f ($c < 3) break; password中必须包含 四种类型中三种或四种
最后 password 还得等于 42
构造:
password=42.asd+ASD.00000000000
bugku—— 代码审计 做题记录相关推荐
- bugku——web 做题记录
Table of Contents 2,秋名山车神: 3,速度要快 4 welcome to the bugkuctf 1,login1(sql约束攻击) sql约束攻击: 2,过狗一句话 3,细心 ...
- bugku ——加密 做题记录
目录 1,滴答-滴 2,聪明的小羊 3,ok 4这不是摩斯密码 5,easy_crypto 6,简单加密 7,散乱的密文 8 凯撒部长的奖励 9,一段base64 10,.!? 11,+[]-(Bra ...
- 概率期望题(期望 DP)做题记录
概率期望题(期望 DP)做题记录 P3830 [SHOI2012]随机树 难点在于第二问:生成树的期望深度. 不 wei zhuo 捏,设 \(dp_{i,j}\) 表示已经有了 \(i\) 个叶子结 ...
- 数数题(计数类 DP)做题记录
数数题(计数类 DP)做题记录 CF1657E Star MST 我们称张无向完全图是美丽的当且仅当:所有和 \(1\) 相连的边的边权之和等于这张完全图的最小生成树的边权之和. 完全图点数为 \(n ...
- CSDN 第六期编程竞赛做题记录
CSDN 第六期编程竞赛做题记录 -- CSDN编程竞赛报名地址:https://edu.csdn.net/contest/detail/16 9.18周日闲来无视写一下 csdn 的编程题,每期编程 ...
- 退役前的做题记录5.0
退役前的做题记录5.0 出于某种原因新开了一篇. [CodeChef]Querying on a Grid 对序列建立分治结构,每次处理\((l,mid,r)\)时,以\(mid\)为源点建立最短路树 ...
- Regional 做题记录 (50/50)
写在前面 博主深感自己太弱了QAQ 于是有了一个刷水的想法,Regional的题目还是有很多考查思维的题目,所以这次是乱做50道思考题,可能会顺带做一些水题,这些题的简要题解会写到这篇博文里面,希望能 ...
- 2020.7月做题记录
转眼就到了2020的下半年了-前方仍是一片茫然. 长期计划 prufer 序列 2020.07.02-2020.07.04 Problem Finished P2624 [HNOI2008]明明的烦恼 ...
- 退役前的做题记录1.0
退役前的做题记录1.0 租酥雨最近很懒qwq,具体表现在写题的时候不想发题解了. 但是想想这样也不太好,就决定发个一句话(半句话到几句话不等)题解上来. 2018-09.18-2018-09.28 [ ...
最新文章
- 销售收入科目确定VKOA
- linux永久设置nlslang,【图片】Liddy's Linux编译日志(版本8.4)【蕾迪猫的linux吧】_百度贴吧...
- ofstream与ate的故事 经典!
- 写5个不同的自己的函数,来截取一个全路径的文件的扩展名,允许封装php库中已有的函数。
- 第七周linux内核分析
- 日常小记录json文件(json.load()、json.loads()、json.dump()、json.dumps())
- WSSv3和SharePoint2007安装指南
- alsa driver--card
- rabbitMQ概念详细介绍
- 【艾特淘】淘宝流量黄金标题的制作方法本
- 不使用80,443,端口,域名还需要备案吗?域名没有备案应该怎么选服务器。
- 书到用时方恨少,绝知此事要躬行--谈TCP/UDP编程
- 1.5_全网最全 Windows Java IDE 环境 MyEclipse 10 安装过程和 cracker 以及 cracker 失败或者过期处理还有如何配置界面和使用中文包!
- 跨平台flutter- window与Android Studio环境配置
- 视觉感知在数据可视化中的作用
- python 制作抽奖箱_抽奖箱怎么做
- 伯禹公益AI《动手学深度学习PyTorch版》Task 06 学习笔记
- Python数学问题5:输入三个整数并由小到大进行输出
- FGF21 类似物 PF-05231023 改善糖尿病并发症
- Dba常用的sql和视图