1、题目信息:
描 述: WarmUp,PHP代码审计
2、解题思路:
打开靶机链接以后,是一张图片。查看源代码:
看到源码页面,就知道是代码审计了,按照代码逻辑解题
3、解题过程:
1 <?php 2 highlight_file(__FILE__); 3 class emmm 4 { 5 public static function checkFile(&$page) 6 { 7 $whitelist = ["source"=>"source.php","hint"=>"hint.php"]; 8 if (! isset($page) || !is_string($page)) { 9 echo "you can't see it"; 10 return false; 11 } 12 13 if (in_array($page, $whitelist)) { 14 return true; 15 } 16 17 $_page = mb_substr( 18 $page, 19 0, 20 mb_strpos($page . '?', '?') 21 ); 22 if (in_array($_page, $whitelist)) { 23 return true; 24 } 25 26 $_page = urldecode($page); 27 $_page = mb_substr( 28 $_page, 29 0, 30 mb_strpos($_page . '?', '?') 31 ); 32 if (in_array($_page, $whitelist)) { 33 return true; 34 } 35 echo "you can't see it"; 36 return false; 37 } 38 } 39 40 if (! empty($_REQUEST['file']) 41 && is_string($_REQUEST['file']) 42 && emmm::checkFile($_REQUEST['file']) 43 ) { 44 include $_REQUEST['file']; 45 exit; 46 } else { 47 echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />"; 48 } 49 ?>
查看代码,首先判断请求是否存在file字符串参数,然后将file参数放入emmm checkFile函数中进行判断。
当checkFile函数返回true后,通过include函数来加载file参数中的页面。
那么思路就比较明确了,file参数必须是在白名单内的:source或hint。那先试下hint:
看来flag在ffffllllaaaagggg这个文件中。
又知道include是目录包含,那么只要绕过白名单检测并进行目录跳转就可以了:
checkFile函数$_page取file参数第一个问号之前的字段检查文件名是否在白名单内于是构造file参数为hint.php?/../../../../../ffffllllaaaagggg
hint.php?/被当作目录,之后上跳目录就好了
4、思路总结
include可以跨目录包含文件
题目:
SQL注入
解题:
启动靶机,是一个Web登录页面
简单输入单引号试下:
看报错是MariaDB直接没有做任何过滤,那么简单了,用通用的恒等式再加上mariaDB的注释符组合一下:
成功登录
打开靶机,发现是一个动态页面:
看下源码:
代码很简单,传入一个cat的参数,并且让值等于dog就可以了,试一下:
题目:
ACTF 2020 新生赛 include 1
解题:
打开靶机,点击tips,发现跳转到新的页面,url中include存在文件包含漏洞:
但是只有一个flag.php,没有任何提示。
猜测可能是被注释掉了。
因为文件包含读取的是文件,而不是文件源码,内容里面是php代码的话就会执行。
尝试使用php伪协议来过滤读取,使其中的php代码失效
php://filter/read=convert.base64-encode/resource=xxx.php
得到一串base64字符串,解码得出flag:
题目:
简单试了下,输入单引号出现报错,可以看出来是字符串注入,那么单引号闭合后输入恒等式:
一共三行数据,这里试了下union联合查询查其他字段,发现有waf过滤了select等关键字
尝试了注释、大小写等绕过均无效。
那就先尝试查一下其他内容:
查看数据库和表:
6个数据库,两张表,看下第一个表:
两个字段,其中有flag。再查了第二个表就能得出words表的data列中就是实际表单查询的用户名和id
将表1919810931114514名字改为words,flag列名字改为id,那么就能得到flag的内容了
修改表名(将表名user改为users)
alter table user rename to users;
修改列名(将字段名username改为name)
alter table users change uesrname name varchar(30);
最终语句构造如下:
'; alter table words rename to words1;alter table `1919810931114514` rename to words;alter table words change flag id varchar(50);#
然后使用1' or 1=1#
即可查询出flag