WarmUp
题目介绍
- 这道题来自BUUCTF,
Web
组的第一题。
- 设计的知识点包括:
题目代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| <?php highlight_file(__FILE__); class emmm { public static function checkFile(&$page) { $whitelist = ["source"=>"source.php","hint"=>"hint.php"]; if (! isset($page) || !is_string($page)) { echo "you can't see it"; return false; }
if (in_array($page, $whitelist)) { return true; }
$_page = mb_substr( $page, 0, mb_strpos($page . '?', '?') ); if (in_array($_page, $whitelist)) { return true; }
$_page = urldecode($page); $_page = mb_substr( $_page, 0, mb_strpos($_page . '?', '?') ); if (in_array($_page, $whitelist)) { return true; } echo "you can't see it"; return false; } }
if (! empty($_REQUEST['file']) && is_string($_REQUEST['file']) && emmm::checkFile($_REQUEST['file']) ) { include $_REQUEST['file']; exit; } else { echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />"; } ?>
|
函数解析
- isset ( mixed
$var
, mixed $...
= ? ) : bool
- is_string ( mixed
$var
) : bool
- in_array ( mixed
$needle
, array $haystack
, bool $strict
= false
) : bool
- 检查数组
haystack
中是否存在某个值needle
。
- 若数组为键值数组,则匹配值。
- mb_substr ( string
$str
, int $start
, int $length
= NULL , string $encoding
= mb_internal_encoding() ) : string
- 根据字符数执行一个多字节安全的 substr() 操作。
- 取字符串
str
从start
开始length
长度的子串。
- mb_strpos ( string
$haystack
, string $needle
, int $offset
= 0 , string $encoding
= mb_internal_encoding() ) : int
- 查找字符串
needle
在字符串haystack
中首次出现的位置。
- urldecode ( string
$str
) : string
- include
代码逻辑
主函数
- 第
40
行的if
语句判断了
- 提交的参数
file
是否为空;
- 参数
file
是否为字符串;
- 函数
checkFile
是否返回true
。
- 上述条件满足就将
file
对应的文件打开,不满足则显示滑稽。
checkFile函数
- 在第
5
行中将参数file
赋值给变量page
。
- 第
7
行给出白名单,分别是source.php
、hint.php
。
- 第
8
行判断变量page
是否已设置为字符串,若没有,则滑稽伺候。
- 第
13
行第一次判断page
是否属于白名单,若是则包含文件。
- 第
17
行裁剪原始变量page
,_page
留下第一个?
之前的字符串。
- 第
22
行第二次判断page
是否属于白名单。
- 第
26
行对变量page
进行URL
编码的解码,赋值给_page
。
注意:page
取自URL
,作为参数传入会先进行一次解码。
- 第
27
行裁剪解码后的变量_page
。
- 第
32
行第三次判断_page
是否属于白名单。
hint.php
1
| flag not here, and flag in ffffllllaaaagggg
|
EazySQL
解题过程
- 在上述我标红的三次判断中,可以设置不同状态的
page
得到文件包含。
- 第一次判断时,对变量
page
没有做任何改变,满足条件只有参数file
(原始传入的page
)为source.php
或hint.php
,很明显无法包含文件ffffllllaaaagggg
。
- 第二次判断时,考虑到裁剪之后需要满足
?
前包含source.php
或hint.php
,之后的部分可以任意修改。
包含?
后就已经绕过了第一个判断。
- 尝试包含到文件
ffffllllaaaagggg
,在?
之后不断添加访问上级目录符号../
,例如。
1
| source.php?../../ffffllllaaaagggg
|
- 使用
%253f
替换?
位置之后,传入服务器时变成%3f
,此时即可绕过前两次判断。
- 在第三次判断前,
urldecode()
将%3f
转化为?
,完成判断。
- 给出第三次判断的
Payload
。
1
| source.php%253f../../../../../../../../ffffllllaaaagggg
|
题目介绍
- 这道题来自BUUCTF,
Web
组的第二题。
- 涉及的知识点包括:
题目解析
- 此时你输入的字符串将被用于数据库查询对应的用户,通过这样的机制,即可构造
SQL
注入攻击。
SQL
注入具体知识参考我的一篇博客。
解题过程
- 观察攻击场景,通常来说用户名和密码都为字符串输入,故此处猜测为字符型注入。
- 假设查询语句模型。
1
| SELECT * FROM user WHERE user_id='${User-Name}' and passwd='${User-Passwd}';
|
- 尝试使用注释
#
屏蔽后面代码,下面给出用户名和密码的Payload
。
- 若注释符被屏蔽,使用
'
构造查询字符串闭合,给出Payload
。