データフロー

このドキュメントでは、モジュールとエージェント間のさまざまなデータフローを説明します。MessagePack はシリアル化プロトコルですが、読みやすさを考慮し、ここではデータが JSON 形式で表示されています。

無害な POST リクエスト

HeadersInCookie 値の削除、また TLSProtocolTLSCipher の入力を確認します。

{
"ModuleVersion": "sigsci-module-apache 0.214",
"ServerVersion": "Apache/2.4.7 (Ubuntu) PHP/5.5.9-1ubuntu4.11 OpenSSL/1.0.1f",
"ServerFlavor": "prefork",
"ServerName": "soysauce.in",
"Timestamp": 1438838135,
"RemoteAddr": "198.51.100.209",
"Method": "POST",
"Scheme": "https",
"URI": "/add-data"
"Protocol": "HTTP/1.1",
"TLSProtocol": "TLSv1.2",
"TLSCipher": "ECDHE-RSA-AES128-SHA256",
"HeadersIn": [
[ "Host", "soysauce.in" ],
[ "Accept", "*/*" ],
[ "Connection", "keep-alive" ],
[ "Cookie", "" ],
[ "User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_4) AppleWebKit/600.7.12 (KHTML, like Gecko) Version/8.0.7 Safari/600.7.12"],
[ "Accept-Language", "en-us" ],
[ "Referer", "https://soysauce.in/" ],
[ "Accept-Encoding", "gzip, deflate" ],
],
"PostData": "foo=bar&company=something"
}

このリクエストは完全に無害であるため、返されるのは 200 レスポンスのみです (リクエストの続行を許可)。

{
"WAFResponse": 200
}

これでリクエストは終了です。

無害なリクエスト (404エラーあり)

$ curl -v '127.0.0.1:8085/junk'
* Trying 127.0.0.1...
* Connected to 127.0.0.1 (127.0.0.1) port 8085 (#0)
> GET /junk HTTP/1.1
> User-Agent: curl/7.37.1
> Host: 127.0.0.1:8085
> Accept: */*
>
< HTTP/1.1 404 Not Found
< Content-Type: text/plain; charset=utf-8
< Date: Wed, 05 Aug 2015 18:38:24 GMT
< Content-Length: 19
<

以下のように変換されます。

{
"ModuleVersion": "sigsci-sdk-golang 1.0",
"ServerVersion": "go1.4.2",
"ServerFlavor": "",
"ServerName": "127.0.0.1:8085",
"Timestamp": 1438799904,
"RemoteAddr": "127.0.0.1",
"Method": "GET",
"Scheme": "http",
"URI": "/junk",
"Protocol": "HTTP/1.1",
"HeadersIn": [
[ "User-Agent", "curl/7.37.1" ],
[ "Accept", "*/*" ],
],
}

レスポンスは 200 のみ、またはレスポンスの通過を許可します。

{
"WAFResponse": 200
}

サーバーは正常に稼働します。リクエストの最後に、エラーの発生や非常に大量の出力、または処理に非常に長い時間がかかったことが判明した場合、PostRequest でフォローアップします。ResponseCodeResponseMillisResponseSize、さらに HeadersOut の編集内容および入力を確認します。

{
"ModuleVersion": "sigsci-sdk-golang 1.0",
"ServerVersion": "go1.4.2",
"ServerFlavor": "",
"ServerName": "127.0.0.1:8085",
"Timestamp": 1438799904,
"RemoteAddr": "127.0.0.1",
"Method": "GET",
"Scheme": "http",
"URI": "/junk",
"Protocol": "HTTP/1.1",
"WAFResponse": 200,
"ResponseCode": 404,
"ResponseMillis": 1,
"ResponseSize": 19,
"HeadersIn": [
[ "User-Agent", "curl/7.37.1" ],
[ "Accept", "*/*" ],
],
"HeadersOut": [
[ "Content-Type", "text/plain; charset=utf-8" ]
]
}

SQLI と 406 を含むブロックされたリクエスト

以下は生の HTTP ヘッダーです。

$ curl -v '127.0.0.1:8085/junk?id=1+UNION+ALL+SELECT+1'
* Connected to 127.0.0.1 (127.0.0.1) port 8085 (#0)
> GET /junk?id=1+UNION+ALL+SELECT+1 HTTP/1.1
> User-Agent: curl/7.37.1
> Host: 127.0.0.1:8085
> Accept: */*
>
< HTTP/1.1 406 Not Acceptable
< Content-Type: text/plain; charset=utf-8
< Date: Wed, 05 Aug 2015 17:59:46 GMT
< Content-Length: 19
<
406 not acceptable

これは、以下のフローに変換されます。

サーバー/モジュールはエージェントに以下を送信します。

{
"ModuleVersion": "sigsci-sdk-golang 1.0",
"ServerVersion": "go1.4.2",
"ServerFlavor": "",
"ServerName": "127.0.0.1:8085",
"Timestamp": 1438796694,
"RemoteAddr": "127.0.0.1",
"Method": "GET",
"Scheme": "http",
"URI": "/junk?id=1+UNION+ALL+SELECT+1",
"Protocol": "HTTP/1.1",
"HeadersIn": [
[ "Accept", "*/*" ],
[ "User-Agent", "curl/7.37.1" ],
],
}

エージェントは以下のように応答します。RequestID が入力され、X-SigSci-Tags ヘッダーが検出内容 (この場合は SQLi) を記述していることを確認します。

{
"WAFResponse": 406,
"RequestID": "55c24b96ca84c02201000001",
"RequestHeaders": [
[ "X-SigSci-Tags", "SQLI" ]
]
}

リクエストはブロックされ、リクエストの最後に UpdateRequest メッセージが表示されます。

{
"RequestID": "55c24b96ca84c02201000001",
"ResponseCode": 406,
"ResponseMillis": 1,
"ResponseSize": 19,
"HeadersOut": [
[ "Content-Type", "text/plain; charset=utf-8" ],
]
}