设为首页 加入收藏

TOP

BugkuCTF~代码审计~WriteUp(四)
2019-08-23 00:40:55 】 浏览:102
Tags:BugkuCTF 代码 审计 WriteUp
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

代码

首页 上一页 1 2 3 4 5 下一页 尾页 4/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Ubuntu 16.04.4 LTS环境中php7.0.. 下一篇php禁用函数设置及查看方法详解

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目