0x001トピック
0x002インジェクションステートメントを表示
トラフィックパケットのインポートはWireshark
非常に面倒に見えます。url
ブラウザリクエストhttp
で使用されるプロトコルを入力して、http
プロトコルデータパケットを直接除外します。
http
要求されたデータパケットを除外します。
インジェクションステートメントは次のとおりです。
http://localhost:81/?id=1' and ascii(substring((select keyid from flag limit 0,1),1,1))=32#
これは、攻撃者がSQLインジェクションにブールブラインドインジェクションを使用していることを示しています。
ブールブラインドノートチェックについて:https://blog.csdn.net/weixin_44032232/article/details/109358571
0x003応答パケットを観察します
ここでは、インジェクションステートメントによって返されるデータパケットは、成功と失敗で異なっている必要があると考えています。
sql
挿入された応答パケットを観察します。
失敗応答コンテンツの挿入:
成功応答コンテンツの挿入:
これから、注入された成功した応答パケットを最初に除外することが可能かどうかを考えることができますか???では、フィルタリングにはどのルールを使用する必要がありますか、それとも応答パケットのどの特性をフィルタリングに使用する必要がありますか???
私が考えるフィルター条件:
- 概要フィルタリングされた応答には、
文章内容
すべての応答パケットが含まれます - 応答パケットの長さに応じてフィルタリングします
インジェクションに失敗した場合の応答パケットの長さ:インジェクションに成功した場合の応答パケットの長さ
:
以下のためWireshark
の構文私は、応答パケットフィルタリングの長さのためにここにいるので、コンテンツフィルタリングの構文を見つけることではないか、と非常に精通していないです。
Wireshark httpフィルタリングルール:
http.host==magentonotes.com
http.host contains magentonotes.com
//过滤经过指定域名的http数据包,这里的host值不一定是请求中的域名
http.response.code==302
//过滤http响应状态码为302的数据包
http.response==1
//过滤所有的http响应包
http.request==1
//过滤所有的http请求,貌似也可以使用http.request
http.request.method==POST
//wireshark过滤所有请求方式为POST的http请求包,注意POST为大写
http.cookie contains guid
//过滤含有指定cookie的http数据包
http.request.uri==”/online/setpoint”
//过滤请求的uri,取值是域名后的部分
http.request.full_uri==” http://task.browser.360.cn/online/setpoint”
//过滤含域名的整个url则需要使用http.request.full_uri
http.server contains “nginx”
//过滤http头中server字段含有nginx字符的数据包
http.content_type == “text/html”
//过滤content_type是text/html的http响应、post包,即根据文件类型过滤http数据包
http.content_encoding == “gzip”
//过滤content_encoding是gzip的http包
http.transfer_encoding == “chunked”
//根据transfer_encoding过滤
http.content_length == 279
http.content_length_header == “279″
//根据content_length的数值过滤
http.server
//过滤所有含有http头中含有server字段的数据包
http.request.version == “HTTP/1.1″
//过滤HTTP/1.1版本的http包,包括请求和响应
http.response.phrase == “OK”
//过滤http响应中的phrase
content-Length
フィルタによって長さ。フィルタ構文でhttp.content_length == 366
すべて成功した注入された文はまた、応答パケットから見ることができます。
http://localhost:81/?id=1' and ascii(substring((select keyid from flag limit 0,1),1,1))=102#
このSQLステートメントの意味:最初の文字のASCIIコードは102
>>> print(chr(102)) # 将ASCII码转换为字符
>>> f
インジェクションが成功したときに文字のASCII値を1つずつ確認するにはどうすればよいですか。
0x004スクリプト作成
上記
のフィルタリングされた結果をエクスポートし、通常のフィルタリングを使用して、挿入された文と文字に対応するASCIIコードを除外します
import re
number = []
with open("aa.txt","r",encoding="utf-8") as f:
for i in f.readlines():
flag_number = re.findall(r"\[Request URI: .*?=(\d+)%23\]",i,re.S) # 字符对应的ASCII码
url_list = re.findall(r"\[Request URI: (.*?)\]",i,re.S) # 注入的url
if flag_number:
print(url_list)
number.append(flag_number[0])
ここでは、成功したインジェクションステートメントのシーケンスに注意してください。つまり、上の図で丸で囲まれた場所は、成功したインジェクションの実行フローである順序(最初の文字から38文字まで)に並べ替えられます。
文字に対応するASCIIコードを知ってから、ASCIIコードを介して対応する文字を取得します。
ついになくなったflag
import re
number = []
with open("aa.txt","r",encoding="utf-8") as f:
for i in f.readlines():
flag_number = re.findall(r"\[Request URI: .*?=(\d+)%23\]",i,re.S)
url_list = re.findall(r"\[Request URI: (.*?)\]",i,re.S)
if flag_number:
print(url_list)
number.append(flag_number[0])
print(number)
flag = ''
for i in number:
flag +=chr(int(i))
print(flag)