[HCTF 2018]WarmUp;[极客大挑战 2019]EasySQL;[极客大挑战 2019]Havefun;[强网杯 2019]随便注
[HCTF 2018]WarmUp
打开题目,可知存在source.php
访问
source.php
得到源码,访问hint.php
得到提示
分析源码
if (! empty($_REQUEST['file'])#首先传入一个参数`file`
&& is_string($_REQUEST['file'])#判断file是否为字符串
&& emmm::checkFile($_REQUEST['file'])#并将参数传递给checkFile
)
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;
}#判断是否有内容,是否为字符串,如果不是,则返回false
if (in_array($page, $whitelist)){
return true;
}#如果参数里面有白名单上的数据,则返回ture
$_page = mb_substr(
$page,
0,
mb_strpos($page . '?', '?')
);#mb_substr函数是在参数中截取内容,0表示从第一个字符开始;mb_subpos函数表示在参数中寻找到匹配的字符后返回它的位置,若不存在则返回false。此配合表示截取?之前的内容
if (in_array($_page, $whitelist)) {
return true;
}#再一次检查截取后的参数是否存在白名单,若存在,则返回ture
$_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;
}
}
{
include $_REQUEST['file'];
exit;#上面的if条件都返回的是ture,就可以进行文件包含了
故得payload/source.php?file=hint.php?../../../../../ffffllllaaaagggg
[极客大挑战 2019]EasySQL
username=1'&password=2
,报错,说明存在注入点,但是引号加在第二个参数后面,所以尝试闭合2,在前面加个'
,
(这里若没有闭合,后面都会一直报错,原因与下面情况类似)
之后我又进行报错注入,结果被逮住了
然后尝试了一下万能密码,结果就成功得到flag了username=1'or 1=1--+&password='2
[极客大挑战 2019]Havefun
直接出答案
但还是按照它的提示来
[强网杯 2019]随便注
select和相关的查询语句被过滤了
方法一:
可使用堆叠注入,concat
连接语句
预编译用法:
set
用于设置变量名和值
prepare
用于预备一个语句,并赋予名称,以后可以引用该语句
execute
执行语句
deallocate prepare
用来释放掉预处理的语句
如
大写绕过strstr
函数
方法二:
将select * from 1919810931114514
编码为16进制,开头加0x
方法三:
使用ascii,再用char
转换成字符
方法四:
重命名表名,字段名,再使用1' or 1=1#
访问