多分今のskipfish(1.85b)でSQLインジェクションをみつけるのは難しい(´・ω・`)


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

*1:Win7Cygwin上で動かしてた...