http://code.google.com/p/skipfish/
こんな感じであーでもないこーでもないと試行錯誤。あーようやく動いた...*1
youichi@hoge:skipfish-1.85b ./skipfish -W dictionaries/complete.wl -C JSESSIONID=123456789 -X logout,login -o result http://127.0.0.1:8080/
が、結果を見るとSQLなんて単語ひとつもない。
確かにSQLインジェクションがはいっているはずのアプリに向けたはずなんだが...。
なんかいや〜な予感がする。
アクセスログを見て見ると...こんな感じでアクセスしてやがる(´・ω・`)
/?_test1=c:\windows\system32\cmd.exe&_test2=/etc/passwd&_test3=|/bin/sh&_test4=(SELECT%20*%20FROM%20nonexistent)%20--&_test5=>/no/such/file&_test6=<script>al ert(1)</script>&_test7=javascript:alert(1)
っていうかこれだけかい(´・ω・`)
なんつーか...ん〜...
おもむろにgrep。
youichi@hoge:skipfish-1.85b grep -nH SELECT * analysis.c:2535: inl_strcasestr(res->payload, (u8*)"\nSELECT * FROM") || config.h:116: "&_test4=(SELECT * FROM nonexistent) --" \ report.c:135: ((inl_strcasestr(pv->req->par.v[pv->fuzz_par], (u8*)"SELECT ") ||
むむむ...。
ソースをあたってみると...ありゃま。
analysis.c 2532 /* Three very lame rules follow; help improve. */ 2533 2534 if (inl_strcasestr(res->payload, (u8*)"\nCREATE TABLE") || 2535 inl_strcasestr(res->payload, (u8*)"\nSELECT * FROM") || 2536 inl_strcasestr(res->payload, (u8*)"\nDROP TABLE")) { 2537 problem(PROB_FILE_POI, req, res, (u8*)"SQL script", req->pivot, 0); 2538 return; 2539 } config.h 110 /* Single query for IPS detection - Evil Query of Doom (tm). */ 111 112 #define IPS_TEST \ 113 "?_test1=c:\\windows\\system32\\cmd.exe" \ 114 "&_test2=/etc/passwd" \ 115 "&_test3=|/bin/sh" \ 116 "&_test4=(SELECT * FROM nonexistent) --" \ 117 "&_test5=>/no/such/file" \ 118 "&_test6=<script>alert(1)</script>" \ 119 "&_test7=javascript:alert(1)" report.c 128 /* Parametric nodes that seem to contain queries in parameters, and are not 129 marked as bogus_par, should be marked as dangerous. */ 130 131 if (pv->fuzz_par != -1 && !pv->bogus_par && 132 (((q1 = (u8*)strchr((char*)pv->req->par.v[pv->fuzz_par], '(')) && 133 (q2 = (u8*)strchr((char*)pv->req->par.v[pv->fuzz_par], ')')) && q1 < q2 && 134 !isdigit(q1[1])) || 135 ((inl_strcasestr(pv->req->par.v[pv->fuzz_par], (u8*)"SELECT ") || 136 inl_strcasestr(pv->req->par.v[pv->fuzz_par], (u8*)"DELETE ") ) && 137 inl_strcasestr(pv->req->par.v[pv->fuzz_par], (u8*)" FROM ")) || 138 (inl_strcasestr(pv->req->par.v[pv->fuzz_par], (u8*)"UPDATE ") || 139 inl_strcasestr(pv->req->par.v[pv->fuzz_par], (u8*)" WHERE ")) || 140 inl_strcasestr(pv->req->par.v[pv->fuzz_par], (u8*)"DROP TABLE ") || 141 inl_strcasestr(pv->req->par.v[pv->fuzz_par], (u8*)" ORDER BY "))) 142 problem(PROB_SQL_PARAM, pv->req, pv->res, 0, pv, 0);
ちなみに全体のコードの行数はこんな感じ。
youichi@hoge:skipfish-1.85b cat *.c *.h | wc -l 13119
多分攻撃するためのロジックを考えるにこの行数は少ない気がする。
ぐぐればSQLインジェクションの為のオープンソースなツールがいろいろ出てくるみたいなんだが...
SQLインジェクションをスキャンしてくれるツール
http://fnya.cocolog-nifty.com/blog/2007/05/sql_788f.html
中身の攻撃手法だってなんかこういうのあるしなぁ...
http://www.unixwiz.net/techtips/sql-injection.html
参考にならなかったのかなぁ? それとも実装が端にめんどくさかっただけか?
いずれにせよ、skipfishじゃSQLインジェクションを検知しにくそう。
SQLインジェクション調べてくれる専用のツールでも使うか商用スキャナーを買うかのどちらかなんでしょ...
ちなみにおいらは商用以外のスキャナーをさわったのはこれが初めてだったりしますw
こいつ15分くらいアタックするとアクセスログが600Mbyteくらいになる程度の破壊力を持っている。
別の用途に使えないんかなw