本文章中所有內容僅供學習交流使用,不用于其他任何目的。否則由此產生的一切后果均與作者無關!
雷池waf概念
雷池 WAF(SafeLine)是長亭科技開源的一款 Web 應用防火墻,部署在網站前面,把所有進來的 HTTP/HTTPS 流量先過一遍“安檢”,再決定是否放行。
作用:
雷池通過過濾和監控 Web 應用與互聯網之間的 HTTP 流量來保護 Web 服務。可以保護 Web 服務免受 SQL 注入
、XSS
、 代碼注入
、命令注入
、CRLF 注入
、ldap 注入
、xpath 注入
、RCE
、XXE
、SSRF
、路徑遍歷
、后門
、暴力破解
、CC
、爬蟲
等攻擊。
一句話總結:雷池 WAF = 免費 + 一鍵安裝 + 企業級 Web 安全防護,適合個人站、中小企業以及需要私有化部署的場景。免費使用。
這是官方文檔:雷池 WAF | 下一代 Web 應用防火墻 | 免費使用
逆向目標:aHR0cHM6Ly93d3cuZ2RzZ2ouY29tL25vdGljZS8=
瀏覽器DevTool控制臺檢測
當清除cookies后,重新抓包會被檢測到
并且控制臺會被無限清除
自動化工具檢測:
playwright測試
需要點擊,模擬點擊試一次
直接報當前環境被調試
selenium測試
同上
drissionpage測試
可以繞過檢測
如何繞過控制臺檢測
打開腳本斷點進行調試
到challenge.js到這里有判斷是不是機器人的檢測,分數越高,越像機器人,越容易被檢測到。
從v函數進去,里面有多個檢測點
一共有四十四個檢測點,檢測環境、控制臺、自動化的。
像以下這些點就是檢測自動化的
被檢測到直接滿分畢業,測試一下打開自動化,分數是多少
220分,太像機器人了。
逆向思路
那如何繞過反調試,并獲取正常cookies,利用協議去請求呢?
這個值是我們要得出的
第一步:
直接源頭注釋替換文件,方便調試
第二步,第一次請求,請求首頁獲取issue_id值和sl-session
第一次報468
第三步:第二次請求,請求?issue
接口
issue_id值是第一次請求頁面得內容
請求獲取這兩個重要的值
第四步,第三次請求,求verify接口
需要分析三個參數
issue_id參數由?issue
接口返回
visitorId?設備指紋
result 由issue返回參數在經過一系列加工返回
跟棧
這個文件是臨時生成得文件
blob
重新刷新進入斷點會消失
發現用來wasm模塊加密
如何調用wasm模塊,請看這一篇文章JS逆向之Wasm逆向過程-CSDN博客,有興趣可以借助可以借助ai去分析成python代碼或者js代碼。以下是JS代碼調用,python借助subprocess庫去獲取值
const fs = require('fs');
const wasmCode = fs.readFileSync('7cfa74f2.wasm');// const deasync = require('deasync');function aa(e) {e =JSON.parse(e)WebAssembly.instantiate(wasmCode, {"env": {},"wasi_snapshot_preview1": {}}).then(result => {const instance = result.instance;const reset = instance.exports.resetconst arg = instance.exports.argconst calc = instance.exports.calcconst ret = instance.exports.retaaaa = function() {return reset(),e.map(function(e) {return arg(e)}),Array(calc()).fill(-1).map(function() {return ret()})}()console.log(JSON.stringify(aaaa))})}
// aa([1,2,3,4,5,6,7,8,9])aa(process.argv[2])
python核心代碼,記住,傳入的字符串列表,在調用JS時強轉為數組
result = subprocess.run(["node", "123.js",str(response.json()['data']['data'])], capture_output=True, text=True).stdout.strip()
順利出值
接下來就算最后一個參數visitorId值
直接搜索參數
進入i.load()
發現就是個指紋庫創建得,直接生成設備指紋
const Fingerprint2 = require('fingerprintjs2');
Fingerprint2.get(components => {
const values = components.map(component => component.value);
const murmur = Fingerprint2.x64hash128(values.join(''), 31);
console.log(murmur);
});
稍微整理,核心代碼
const fs = require('fs');
const wasmCode = fs.readFileSync('7cfa74f2.wasm');// const deasync = require('deasync');const Fingerprint2 = require('fingerprintjs2');
Fingerprint2.get(components => {
const values = components.map(component => component.value);
const murmur = Fingerprint2.x64hash128(values.join(''), 31);
console.log(murmur);
});
function aa(e) {e =JSON.parse(e)WebAssembly.instantiate(wasmCode, {"env": {},"wasi_snapshot_preview1": {}}).then(result => {const instance = result.instance;const reset = instance.exports.resetconst arg = instance.exports.argconst calc = instance.exports.calcconst ret = instance.exports.retaaaa = function() {return reset(),e.map(function(e) {return arg(e)}),Array(calc()).fill(-1).map(function() {return ret()})}()console.log(JSON.stringify(aaaa))})}
// aa([1,2,3,4,5,6,7,8,9])aa(process.argv[2])
subprocess獲取的值是字符串,強轉類型
result = subprocess.run(["node", "123.js",str(response.json()['data']['data'])], capture_output=True, text=True).stdout.strip()
visitorId = result.split('\n')[0]
result = json.loads(result.split('\n')[1])
data = {"issue_id": response.json()['data']['issue_id'],"result":result,"serials": [],"client": {"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36","platform": "Win32","language": "zh-CN,zh","vendor": "Google Inc.","screen": [1920,1080],"visitorId": visitorId,"score": 100,"target": ["27"]}
}
順利得出
第四次請求攜帶cookies順利獲取數據
cookies={"sl-challenge-jwt": response.json()['data']['jwt']}
?
總結:
繞過雷池到獲取數據一共需要四次請求
第一次請求首頁。狀態碼468,獲取issue_id
第二次請求issue接口,data攜帶issue_id ,獲取issue_id和列表
第三次請求issue接口,data攜帶issue_id,JS逆向跟棧調用wasm傳入列表作為參數獲取result,visitorId為設備指紋,通過fingerprintjs2獲取即可。獲取jwt參數也就是cookie鍵sl_jwt_session的值
第四次攜帶cookie成功獲取數據
?
????????
?
?