目录

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—— 代码审计 做题记录相关推荐

  1. bugku——web 做题记录

    Table of Contents 2,秋名山车神: 3,速度要快 4 welcome to the bugkuctf 1,login1(sql约束攻击) sql约束攻击: 2,过狗一句话 3,细心 ...

  2. bugku ——加密 做题记录

    目录 1,滴答-滴 2,聪明的小羊 3,ok 4这不是摩斯密码 5,easy_crypto 6,简单加密 7,散乱的密文 8 凯撒部长的奖励 9,一段base64 10,.!? 11,+[]-(Bra ...

  3. 概率期望题(期望 DP)做题记录

    概率期望题(期望 DP)做题记录 P3830 [SHOI2012]随机树 难点在于第二问:生成树的期望深度. 不 wei zhuo 捏,设 \(dp_{i,j}\) 表示已经有了 \(i\) 个叶子结 ...

  4. 数数题(计数类 DP)做题记录

    数数题(计数类 DP)做题记录 CF1657E Star MST 我们称张无向完全图是美丽的当且仅当:所有和 \(1\) 相连的边的边权之和等于这张完全图的最小生成树的边权之和. 完全图点数为 \(n ...

  5. CSDN 第六期编程竞赛做题记录

    CSDN 第六期编程竞赛做题记录 -- CSDN编程竞赛报名地址:https://edu.csdn.net/contest/detail/16 9.18周日闲来无视写一下 csdn 的编程题,每期编程 ...

  6. 退役前的做题记录5.0

    退役前的做题记录5.0 出于某种原因新开了一篇. [CodeChef]Querying on a Grid 对序列建立分治结构,每次处理\((l,mid,r)\)时,以\(mid\)为源点建立最短路树 ...

  7. Regional 做题记录 (50/50)

    写在前面 博主深感自己太弱了QAQ 于是有了一个刷水的想法,Regional的题目还是有很多考查思维的题目,所以这次是乱做50道思考题,可能会顺带做一些水题,这些题的简要题解会写到这篇博文里面,希望能 ...

  8. 2020.7月做题记录

    转眼就到了2020的下半年了-前方仍是一片茫然. 长期计划 prufer 序列 2020.07.02-2020.07.04 Problem Finished P2624 [HNOI2008]明明的烦恼 ...

  9. 退役前的做题记录1.0

    退役前的做题记录1.0 租酥雨最近很懒qwq,具体表现在写题的时候不想发题解了. 但是想想这样也不太好,就决定发个一句话(半句话到几句话不等)题解上来. 2018-09.18-2018-09.28 [ ...

最新文章

  1. 销售收入科目确定VKOA
  2. linux永久设置nlslang,【图片】Liddy's Linux编译日志(版本8.4)【蕾迪猫的linux吧】_百度贴吧...
  3. ofstream与ate的故事 经典!
  4. 写5个不同的自己的函数,来截取一个全路径的文件的扩展名,允许封装php库中已有的函数。
  5. 第七周linux内核分析
  6. 日常小记录json文件(json.load()、json.loads()、json.dump()、json.dumps())
  7. WSSv3和SharePoint2007安装指南
  8. alsa driver--card
  9. rabbitMQ概念详细介绍
  10. 【艾特淘】淘宝流量黄金标题的制作方法本
  11. 不使用80,443,端口,域名还需要备案吗?域名没有备案应该怎么选服务器。
  12. 书到用时方恨少,绝知此事要躬行--谈TCP/UDP编程
  13. 1.5_全网最全 Windows Java IDE 环境 MyEclipse 10 安装过程和 cracker 以及 cracker 失败或者过期处理还有如何配置界面和使用中文包!
  14. 跨平台flutter- window与Android Studio环境配置
  15. 视觉感知在数据可视化中的作用
  16. python 制作抽奖箱_抽奖箱怎么做
  17. 伯禹公益AI《动手学深度学习PyTorch版》Task 06 学习笔记
  18. Python数学问题5:输入三个整数并由小到大进行输出
  19. FGF21 类似物 PF-05231023 改善糖尿病并发症
  20. Dba常用的sql和视图

热门文章

  1. mysql设置catalog_catalog恢复目录介绍和配置
  2. access 日期交集_Access重要知识点
  3. Android开发教程之--sql语句一、创建/删除表Stringsql=Createtable
  4. 八十九、常见的圣杯布局和双飞翼布局
  5. 五、Git多人开发:同时变更了文件名和文件内容如何处理?
  6. 十二、Powerbi绘制人员地区分布图和后期学习
  7. 二十八、接了一单Python北京空气质量数据处理
  8. 去伪存真:因果约束下的图神经网络泛化
  9. 入坑推荐系统,拿这个开源项目练手
  10. 大规模图训练调优指南