なんと、コマンドがデータベースを直接ハッキングしたのです。
shigen
最近、侵入ツールについて研究しましたsqlMap
。これは、SQL インジェクション攻撃と侵入テストを自動化するための人気のあるオープン ソース ツールです。これは、Web アプリケーションの SQL インジェクションの脆弱性を検出して悪用するように特別に設計されています。SQLMap には、SQL インジェクションの脆弱性を自動的に検出して悪用し、データベースの機密情報を取得し、データの抽出、変更、削除などのさまざまなデータベース操作を実行するための豊富な機能セットが備わっています。MySQL、Oracle、SQLite、Microsoft SQL Server など、さまざまなデータベース管理システム (DBMS) をサポートしています。エラーベースのインジェクション、フェデレーテッド クエリ インジェクション、ブール ブラインド インジェクション、時間的ブラインド インジェクションなど、複数のインジェクション手法もサポートされています。これらの手法を使用すると、さまざまな種類の SQL インジェクションの脆弱性を自動的に検出して悪用できます。
正式なアドレスは次のとおりです: sqlmap コード アドレス
sqlmapはデータベースに直接接続します
sqlMap
以下はデータベースに接続してデータベースのバージョン情報を取得する場合です。
python3 sqlmap.py -d 'mysql://root:[email protected]:3306/security' -f --banner
単一の URL のプローブ
ここでは、特にテストに使用されるインターフェイスが記述されてshigen
います。spring boot
sqlMap
@GetMapping(value = "findById2")
public Result<User> findById2(@RequestParam(value = "id", defaultValue = "1", required = false) String id) {
User user = userMapper.findById2(id);
return Result.ok(user);
}
id
このコードは読みにくいものではないと思いますが、私のインターフェイスは、この文字列型のパラメータを取得し、データベースからデータをクエリしてそれを返すというものです。
データベースの ORM フレームワークが採用されておりmybatis plus
、データベース部分を操作するためのコードもここに置きます。
@Select("select * from user where id = ${id}")
User findById2(@Param("id") String id);
慎重なパートナーはすでに問題を発見していると思います。
次はステージに上がってくださいsqlMap
!
python3 sqlmap.py -u 'http://127.0.0.1:9000/penetration/findById2?id=20' -dbs
奇跡の瞬間を目撃せよ
すぐに結果に行きます!
コンソールはすべてのローカル データベースを出力し、正確かつ完全です。怖くないですか。最初は信じられず、shigen
めまいだと思いました。
コンソールによって出力された情報を調べてみましたpayload
。そのパラメータは次のとおりですid= 2 and 5685=5685
。これは単なるケースです。実行中に、常に条件の後に続くsqlmap
このようなステートメントが多数挿入されます。where
これは明らかなケースで、常にand
条件の後に条件を追加することで、SQL が可能な限りデータをクエリして、狂ったように挑発したり調べたりできるようにします。
==> Preparing: select * from user where id = ?
==> Parameters: 20) AND 6535=9250 AND (2651=2651(String)
ただし--dbs
、これはsqlMap
コマンドや関数の氷山の一角にすぎず、次のような強力な機能もあります。
Enumeration:
These options can be used to enumerate the back-end database
management system information, structure and data contained in the
tables
-a, --all Retrieve everything
-b, --banner Retrieve DBMS banner
--current-user Retrieve DBMS current user
--current-db Retrieve DBMS current database
--passwords Enumerate DBMS users password hashes
--dbs Enumerate DBMS databases
--tables Enumerate DBMS database tables
--columns Enumerate DBMS database table columns
--schema Enumerate DBMS schema
--dump Dump DBMS database table entries
--dump-all Dump all DBMS databases tables entries
-D DB DBMS database to enumerate
-T TBL DBMS database table(s) to enumerate
-C COL DBMS database table column(s) to enumerate
皆さんに 1 つずつ試してもらうつもりはありません。ここで事例を示します--tables
。確かに、ローカル データベース内のすべてのデータ テーブルがスキャンされています。つまり、seata
4 つのテーブルです。
多くの乾物を見逃さないように、さらなるユースケース スキルshigen
が引き続き共有されます。ようこそ!评论 点赞 在看 关注
** また、静かに言及します: SQLMap は強力なツールですが、使用する場合は法律と倫理を遵守する必要があります。結局のところ、うっかり局内でしゃがんでしまうと、データの価値がわかります。**しかも、現在データがダウンしており、人々 (クラウド サービス) が監視し、データをチェックし、人々 (クラウド サービス) が記録を持っているため、隠れる場所はありません。
追記
この記事はここで終わると思いますか?また、質問も共有したいと思います。コードの脆弱性はどのようにして発見され、データベースに直接攻撃されたのですか? あまり責めることはできませんsqlMap
が、世界中のデータベースは安全ではありません。重要なのはここです${id}
。
集中
${id}
これは文字列置換方式であり、パラメータ値を SQL ステートメントに直接埋め込むため、セキュリティ上のリスクがあります。#{id}
これは、コンパイル済みのパラメーター プレースホルダー メソッドであり、パラメーター値はプレースホルダーを通じて渡され、パラメーターのバインドはデータベース ドライバーによって実行されるため、より安全で信頼性が高くなります。
ここでのプリコンパイル済みパラメータは、最初に学習したものと少し似ていますprepareStatement
。mybatis
または、mybatis plus
最下層は次のように処理されます。
- プレースホルダーの生成: MyBatis はのパラメーター名
#{id}
を使用しid
、さまざまなデータベース ベンダーに従って対応するプレースホルダーを生成します。たとえば、MySQL データベースの場合、プレースホルダは?
、Oracle データベースの場合、プレースホルダは:1
、:2
などになります。 - パラメータのバインド: MyBatis は、生成されたプレースホルダにパラメータ値をバインドします。このプロセスは、基礎となるデータベース ドライバーによって完了します。データベース ドライバーは、準備されたステートメント (PreparedStatement) を使用してこれらのプレースホルダーを処理し、パラメーター値をプレースホルダーに安全にバインドします。
したがって、Alibaba を含む多くの企業仕様ではjava开发手册
、プレースホルダーの使用を明確に規定しています#{}
。
以上が今日の内容のすべてですが、合わせshigen
て毎日が違います!