亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > regex > 正文

精確查找PHP WEBSHELL木馬 修正版

2020-01-20 22:17:14
字體:
來源:轉載
供稿:網友
先來看下反引號可以成功執行命名的代碼片段。代碼如下:
復制代碼 代碼如下:

`ls -al`;
`ls -al`;
echo "sss"; `ls -al`;

$sql = "SELECT `username` FROM `table` WHERE 1";

$sql = 'SELECT `username` FROM `table` WHERE 1'
/*
無非是 前面有空白字符,或者在一行代碼的結束之后,后面接著寫,下面兩行為意外情況,也就是SQL命令里的反引號,要排除的就是它。
*/

正則表達式該如何寫?
分析:
對于可移植性的部分共同點是什么?與其他正常的包含反引號的部分,區別是什么?
他們前面可以有空格,tab鍵等空白字符。也可以有程序代碼,前提是如果有引號(單雙)必須是閉合的。才是危險有隱患的。遂CFC4N給出的正則如下:【(?:(?:^(?:/s+)?)|(?:(?P<quote>["'])[^(?P=quote)]+?(?P=quote)[^`]*?))`(?P<shell>[^`]+)`】。

解釋一下:

【(?:(?:^(?:/s+)?)|(?:(?P<quote>["'])[^(?P=quote)]+?(?P=quote)[^`]*?))】匹配開始位置或者開始位置之后有空白字符或者前面有代碼,且代碼有閉合的單雙引號。(這段PYTHON的正則中用了捕獲命名以及反向引用)

【`(?P<shell>[^`]+)`】這個就比較簡單了,匹配反引號中間的字符串。

python腳本檢測PHP WEBSHELL
然后我將這段代碼寫入程序中,測試跑了一下discuz的程序。結果有一個誤報。誤報的位置為“config.inc.php”中的“define(‘UC_DBTABLEPRE', ‘`ucenter`.uc_');”,什么原因造成的?這行代碼符合了前面有閉合的引號,也有反引號的使用,所以,符合要求,被檢測到了。如何再排除這種情況呢?這個有什么特殊的?前面有逗號“,”?如果是字符串連接的點號“.”呢?再排除逗號?

好吧,我錯了,我不該用我的思維來誤導你。換個思路。找下反引號可執行的代碼的前面字符串的情況,他們只能是行的開始,或者有空白字符(包括空格,tab鍵等),再前面也可以有代碼的結束標識分號“;”,其他的情況,都是不可以執行的吧?嗯,應該是這樣。(如有錯誤,歡迎斧正)既然思路有了,那正則代碼更好寫了。如下【(^|(?<=;))/s*`[^`]+`】,解釋一下,【(^|(?<=;))】匹配位置,是行的開始,或者前面有分號“;”?!?s*`[^`]+`】空白字符任一個,然后是….(你懂的)。OK,寫好之后,檢測,又發現一個問題。

匹配引入文件的正則也匹配了“require_once ‘./include/db_'.$database.'.class.php';”這種代碼,什么原因造成的,您自己分析吧。
給出修復之后的python代碼,如下:
復制代碼 代碼如下:

#!/usr/bin/python
#-*- encoding:UTF-8 -*-
###
## @package
##
## @author CFC4N <cfc4nphp@gmail.com>
## @copyright copyright (c) Www.cnxct.Com
## @Version $Id: check_php_shell.py 37 2010-07-22 09:56:28Z cfc4n $
###
import os
import sys
import re
import time
def listdir(dirs,liston='0'):
flog = open(os.getcwd()+"/check_php_shell.log","a+")
if not os.path.isdir(dirs):
print "directory %s is not exist"% (dirs)
return
lists = os.listdir(dirs)
for list in lists:
filepath = os.path.join(dirs,list)
if os.path.isdir(filepath):
if liston == '1':
listdir(filepath,'1')
elif os.path.isfile(filepath):
filename = os.path.basename(filepath)
if re.search(r"/.(?:php|inc|html?)$", filename, re.IGNORECASE):
i = 0
iname = 0
f = open(filepath)
while f:
file_contents = f.readline()
if not file_contents:
break
i += 1
match = re.search(r'''(?P<function>/b(?:include|require)(?:_once)?/b)/s*/(?/s*["'](?P<filename>[^;]*(?<!/.(?:php|inc)))["']/)?/s*;''', file_contents, re.IGNORECASE| re.MULTILINE)
if match:
function = match.group("function")
filename = match.group("filename")
if iname == 0:
info = '/n[%s] :/n'% (filepath)
else:
info = ''
info += '/t|-- [%s] - [%s] line [%d] /n'% (function,filename,i)
flog.write(info)
print info
iname += 1
match = re.search(r'/b(?P<function>eval|proc_open|popen|shell_exec|exec|passthru|system)/b/s*/(', file_contents, re.IGNORECASE| re.MULTILINE)
if match:
function = match.group("function")
if iname == 0:
info = '/n[%s] :/n'% (filepath)
else:
info = ''
info += '/t|-- [%s] line [%d] /n'% (function,i)
flog.write(info)
print info
iname += 1
match = re.search(r'(^|(?<=;))/s*`(?P<shell>[^`]+)`/s*;', file_contents, re.IGNORECASE)
if match:
shell = match.group("shell")
if iname == 0:
info = '/n[%s] :/n'% (filepath)
else:
info = ''
info += '/t|-- [``] command is [%s] in line [%d] /n'% (shell,i)
flog.write(info)
print info
iname += 1
f.close()
flog.close()
if '__main__' == __name__:
argvnum = len(sys.argv)
liston = '0'
if argvnum == 1:
action = os.path.basename(sys.argv[0])
print "Command is like:/n %s D:/wwwroot/ /n %s D:/wwwroot/ 1 -- recurse subfolders"% (action,action)
quit()
elif argvnum == 2:
path = os.path.realpath(sys.argv[1])
listdir(path,liston)
else:
liston = sys.argv[2]
path = os.path.realpath(sys.argv[1])
listdir(path,liston)
flog = open(os.getcwd()+"/check_php_shell.log","a+")
ISOTIMEFORMAT='%Y-%m-%d %X'
now_time = time.strftime(ISOTIMEFORMAT,time.localtime())
flog.write("/n----------------------%s checked ---------------------/n"% (now_time))
flog.close()

稍微檢測了一下Discuz7.2的代碼,還是有誤報的,誤報的為這種包含sql的代碼:
復制代碼 代碼如下:

$query = $db->query("SELECT `status`,`threads`,`posts`
FROM `{$tablepre}forums` WHERE
`status`='1';
");

稍微檢測了一下Discuz7.2的代碼,還是有誤報的,誤報的為這種包含sql的代碼:
復制代碼 代碼如下:

$query = $db->query("SELECT `status`,`threads`,`posts`
FROM `{$tablepre}forums` WHERE
`status`='1';
");

由于這個腳本是按照一行一行的代碼來處理的,所以,有這種誤報。您自己去修復吧。相對網上流傳的腳本來說,還是比較準確的。
歡迎轉載。轉載請注明來源,以及留下博客鏈接,同時,不能用于商業用途。(已經修復,增加了反引號后面【/s*;】的判斷。2010-07-27 17:06)

PS:如果說上傳文件也算是危險的、值得注意的操作的話,建議加上move_uploaded_file函數的檢測。你知道在哪里加的。^_^

2010-12-17 關于這些代碼,已經放到google 的代碼托管上了。SVN地址為 http://code.google.com/p/cnxct/ 大家個獲得最新版。

我是一個PHPer,寫的python有點憋,有點懶,還請各位安全界的大牛,程序界的前輩不要鄙視,要給建議,謝謝。php版的以后在寫吧。同時,也歡迎各位安全愛好者反饋最新的web shell特征代碼,我盡力增加到程序中區。
完整的代碼
復制代碼 代碼如下:

#!/usr/bin/python
#-*- encoding:UTF-8 -*-
###
## @package
##
## @author CFC4N <cfc4nphp@gmail.com>
## @copyright copyright (c) Www.cnxct.Com
## @Version $Id$
###
import os
import sys
import re
import time
def listdir(dirs,liston='0'):
flog = open(os.getcwd()+"/check_php_shell.log","a+")
if not os.path.isdir(dirs):
print "directory %s is not exist"% (dirs)
return
lists = os.listdir(dirs)
for list in lists:
filepath = os.path.join(dirs,list)
if os.path.isdir(filepath):
if liston == '1':
listdir(filepath,'1')
elif os.path.isfile(filepath):
filename = os.path.basename(filepath)
if re.search(r"/.(?:php|inc|html?)$", filename, re.IGNORECASE):
i = 0
iname = 0
f = open(filepath)
while f:
file_contents = f.readline()
if not file_contents:
break
i += 1
match = re.search(r'''(?P<function>/b(?:include|require)(?:_once)?/b)/s*/(?/s*["'](?P<filename>[^;]*(?<!/.(?:php|inc)))["']/)?/s*;''', file_contents, re.IGNORECASE| re.MULTILINE)
if match:
function = match.group("function")
filename = match.group("filename")
if iname == 0:
info = '/n[%s] :/n'% (filepath)
else:
info = ''
info += '/t|-- [%s] - [%s] line [%d] /n'% (function,filename,i)
flog.write(info)
print info
iname += 1
match = re.search(r'/b(?P<function>eval|proc_open|popen|shell_exec|exec|passthru|system|assert|fwrite|create_function)/b/s*/(', file_contents, re.IGNORECASE| re.MULTILINE)
if match:
function = match.group("function")
if iname == 0:
info = '/n[%s] :/n'% (filepath)
else:
info = ''
info += '/t|-- [%s] line [%d] /n'% (function,i)
flog.write(info)
print info
iname += 1
match = re.search(r'(^|(?<=;))/s*`(?P<shell>[^`]+)`/s*;', file_contents, re.IGNORECASE)
if match:
shell = match.group("shell")
if iname == 0:
info = '/n[%s] :/n'% (filepath)
else:
info = ''
info += '/t|-- [``] command is [%s] in line [%d] /n'% (shell,i)
flog.write(info)
print info
iname += 1
match = re.search(r'(?P<shell>/$_(?:POS|GE|REQUES)T)/s*/[[^/]]+/]/s*/(', file_contents, re.IGNORECASE)
if match:
shell = match.group("shell")
if iname == 0:
info = '/n[%s] :/n'% (filepath)
else:
info = ''
info += '/t|-- [``] command is [%s] in line [%d] /n'% (shell,i)
flog.write(info)
print info
iname += 1
f.close()
flog.close()
if '__main__' == __name__:
argvnum = len(sys.argv)
liston = '0'
if argvnum == 1:
action = os.path.basename(sys.argv[0])
print "Command is like:/n %s D:/wwwroot/ /n %s D:/wwwroot/ 1 -- recurse subfolders"% (action,action)
quit()
elif argvnum == 2:
path = os.path.realpath(sys.argv[1])
listdir(path,liston)
else:
liston = sys.argv[2]
path = os.path.realpath(sys.argv[1])
listdir(path,liston)
flog = open(os.getcwd()+"/check_php_shell.log","a+")
ISOTIMEFORMAT='%Y-%m-%d %X'
now_time = time.strftime(ISOTIMEFORMAT,time.localtime())
flog.write("/n----------------------%s checked ---------------------/n"% (now_time))
flog.close()
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲成av人片在线观看香蕉| 国产精品亚洲视频在线观看| 国产精品观看在线亚洲人成网| 久久精品99国产精品酒店日本| 久久影视电视剧免费网站清宫辞电视| 日本一区二区三区四区视频| 欧洲亚洲免费视频| 日韩理论片久久| 国产在线一区二区三区| 97激碰免费视频| 91探花福利精品国产自产在线| 亚洲天堂第二页| 国产精品一二区| 国产原创欧美精品| 久久亚洲精品中文字幕冲田杏梨| 在线观看不卡av| 亚洲一区制服诱惑| 欧美成人免费全部观看天天性色| 亚洲影院高清在线| 韩日欧美一区二区| 久久久久成人精品| 国产精品电影观看| 国产精品美女主播在线观看纯欲| 日韩美女免费观看| 亚洲成人激情视频| 国产精品嫩草影院一区二区| 97高清免费视频| 精品网站999www| 日韩一区二区福利| 日韩精品在线观看网站| 亚洲丁香婷深爱综合| 日韩av网站大全| 成人黄色短视频在线观看| 日韩av在线影视| 欧美精品久久久久久久免费观看| 国产免费成人av| 国产精品7m视频| 国产成人自拍视频在线观看| 91亚洲精品一区| 亚洲免费电影在线观看| 91在线视频成人| 欧美疯狂做受xxxx高潮| 久久深夜福利免费观看| 欧美精品videos性欧美| 综合国产在线观看| 亚洲精品久久久久中文字幕欢迎你| 亚洲日韩欧美视频| 国产欧美 在线欧美| 亚洲欧美中文另类| 久久久久久免费精品| 久久中文字幕国产| 久久天天躁狠狠躁夜夜躁2014| 欧美激情图片区| 日韩高清电影好看的电视剧电影| 国产亚洲精品91在线| 国产三级精品网站| 国产视频精品在线| 午夜精品久久久久久久久久久久久| 日韩免费观看在线观看| 亚洲一区二区三区777| 欧美乱妇40p| 黑人极品videos精品欧美裸| 色噜噜狠狠色综合网图区| 日韩av免费在线播放| 国产日韩在线观看av| 久久久国产一区| 国产精品91在线观看| 久久精品国产v日韩v亚洲| 国产精品久久久久久久久| 777午夜精品福利在线观看| 国内精品一区二区三区四区| 日韩中文字幕网站| 亚洲成人av在线| 久久久久九九九九| 中文字幕少妇一区二区三区| 国产一区深夜福利| 国产91热爆ts人妖在线| 亚洲精品国产福利| 超碰精品一区二区三区乱码| 伊人伊成久久人综合网站| 成人精品久久久| 欧美日韩aaaa| 国产精品一区二区久久国产| 亚洲精品中文字幕有码专区| 国产在线久久久| 国产精品青青在线观看爽香蕉| 在线观看成人黄色| 日本a级片电影一区二区| 国产精品久久久久91| 久久久99久久精品女同性| 中文字幕一精品亚洲无线一区| 日本91av在线播放| 97人洗澡人人免费公开视频碰碰碰| 国产精品免费一区| 欧美一级大片在线免费观看| 日韩中文字幕在线视频播放| 日韩电影中文字幕在线| 国产脚交av在线一区二区| 久久国产精品久久久久久久久久| 中文字幕日韩欧美在线| 欧美性色19p| 欧美在线观看视频| 国产精品丝袜一区二区三区| 色阁综合伊人av| 日本a级片电影一区二区| 国产日本欧美一区二区三区| 日韩av快播网址| 中文字幕日韩精品有码视频| 久久久久久网站| 欧美日韩xxxxx| 成人久久一区二区三区| 7777精品久久久久久| 国产精品高清在线观看| 亚洲最大在线视频| 日韩av影院在线观看| 国产精品久久久久久久久久三级| 精品美女国产在线| 日韩大片在线观看视频| 亚洲欧美国产一区二区三区| 国产91av在线| 欧美成aaa人片免费看| 在线视频日韩精品| 亚洲精品国产综合久久| 78色国产精品| 国产日韩欧美一二三区| 91久久精品美女高潮| 日韩欧美中文在线| 亚洲a级在线播放观看| 美女撒尿一区二区三区| 欧美成人第一页| 国产精品自产拍在线观看| 亚洲日本中文字幕免费在线不卡| 日本一区二区三区在线播放| 国产精品一香蕉国产线看观看| 日韩av不卡在线| 日韩网站免费观看高清| 国产精品99久久久久久久久久久久| 亚洲国产精品va在线观看黑人| 日韩av高清不卡| 狠狠久久五月精品中文字幕| 精品国产电影一区| 久久久免费精品| 亚洲激情电影中文字幕| 欧美老少配视频| 日韩视频―中文字幕| y97精品国产97久久久久久| 日本精品久久久久久久| 日韩视频在线免费| 午夜欧美大片免费观看| 欧美一区二粉嫩精品国产一线天| 黄色一区二区在线观看| xvideos亚洲人网站| 国产香蕉97碰碰久久人人| 国产99久久精品一区二区| 亚洲国模精品一区| 精品国产一区二区三区久久狼黑人| 成人精品福利视频| 美女国内精品自产拍在线播放| 日韩av成人在线观看| 久久久女女女女999久久| 色综合亚洲精品激情狠狠| 综合国产在线观看| 久久久久久久久国产| 久久久999精品免费|