黑客攻防之SQL注入原理解析入门教程
生活随笔
收集整理的這篇文章主要介紹了
黑客攻防之SQL注入原理解析入门教程
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
原文地址:http://blog.csdn.net/emaste_r/article/details/8156108
出現的關鍵名詞有: UNION ?SELECT ? load_file ? hex ? ?
為了方便說明我們先創(chuàng)建兩個表:hehe和heihei,很明顯它們一個擁有2列屬性,一個擁有3列屬性
==========================================================================================
一. UNION 的原理
UNION 需要兩個被select的集合擁有相同的列數。一開始我并不是很理解這個相同是什么,然后我做了個實驗: 這個錯誤提示很明顯了:ERROR 1222 (21000): The used SELECT statements have a different number of columns 因為它們select出來的結果集的列數不一致,這對一個操作并集合的union來說是不可操作的,所以就報錯了。 那么是不是只要保證兩個結果集的列數相同就好了呢,我們繼續(xù)做實驗,這個結果也是很明顯:OK !!! 總結:union連結的兩個結果集的列數要相等!
那么我們是怎么利用UNION搞注入呢? (1)猜解表名,只有猜解對了表名才能繼續(xù)深入。用這句: [sql]?view plaincopy
如果表名存在就返回結果集:
總結:在實戰(zhàn)中我們可以用exsits()猜解表名
(2)用UNION猜解列數(- - 終于用到了UNION) 原理是:利用兩邊結果集必須相等列數! [sql]?view plaincopy
如圖,第一次我們猜測兩列(1,2)失敗了,第二次我們猜測三列(1,2,3)成功了。 總結:我們用and union select 1,2,3,4,5,6...;來猜解列數,只有列數相等了,才能返回True!
(3)猜解列名 用猜解表名的方法: [sql]?view plaincopy
如圖,第一次我們猜解有個列名為name1,報錯了,第二次我們猜解列名為name,返回正常,說明真的有個列名為name! 總結:用?select * from hehe where id=3 and exists(select name from hehe);來猜解列名!
(4)猜解字段內容 這個通過步驟三我們已經猜解出列名:name和id了。那么怎么讓它們暴出內容呢? 用: [sql]?view plaincopy
二.load_file()和UNION 讀取服務器文件內容
函數 LOAD_FILE(file_name):讀取文件并將這一文件按照字符串的格式返回。? 文件的位置必須在服務器上 , 你必須為文件制定路徑全名,而且你還必須擁有 FILE 特許權。 文件必須可讀取,文件容量必須小于 max_allowed_packet 字節(jié)。 若文件不存在,或因不滿足上述條件而不能被讀取, 則函數返回值為 NULL。這個load_file()看起來很正常,因為它就是加載一個絕對路徑文件(先保證有讀權限)。可是神奇的是: 它可以在UNOIN中充當一個字段,能夠來讀取服務器的文件。 在我的服務器上有個文件:"d:/test.txt",里面內容是:"key:HelloWorld.",看我用load_file把他讀取出來: [sql]?view plaincopy
總結:“A語句 UNION B語句” 中的這個UNION就是把最終的結果集放到“A語句"的屬性(列)下。上圖上結果是把0,放到列1下,把load_file("d:/tes.txt")的內容放到列2下,把count(*)返回的結果放到列3下。很科學地達到了我們讀取服務器文件的目的。
Ps:上面的 1=2 看到了嗎?是讓”A語句“查詢結果為空,看著舒服。 Ps:這個load_file()用在MySQL中
load_file的過濾 實戰(zhàn)中URL寫成load_file("/etc/passwd")一般會被過濾,所以不科學,不過我們可以用16進制來表示(hex)就好啦: 打開UltraEdit,然后把 /etc/passwd 放到里面,然后右鍵有個16進制編輯,然后就看到了16進制了:0x2F6574632F706173737764,知道為什么要加這個“0x”嗎?因為它是16進制。。。
Ps:經驗哦~如果過濾了空格就用“+”表示
三 用select ?into ? outfile 把一句話木馬寫進文件?
[sql]?view plaincopy然后我們將會看到:
里面有一句話木馬:?<?php ? eval($_POST[cmd]) ?>?然后就能用菜刀去連接了。(什么不知道什么叫做一句話木馬?什么叫做菜刀?趕緊去google吧) 總結:獲得數據庫權限真的是一件好事啊~~
四.用系統(tǒng)函數+UNOIN暴出數據庫的信息(如果web不禁用,極其高效!)
information_schema.SCHEMATA表中的SCHEMA_NAME?查看所有的數據庫:[sql]?view plaincopy
information_schema.TABLES 表中的TABLE_NAME和TABLE_SCHEMA查看所有的表名和所在的數據庫: [sql]?view plaincopy
information_schema.COLUMNS 表中的 COLUMN_NAME?查看表中的所有列名: [sql]?view plaincopy
version()?版本(看第一列):
database()?當前數據庫名字(看第一列):
user()?當前用戶(看第一列):
@@global.version_compile_os??操作系統(tǒng)(看第一列):
and ord(mid(user(),1,1))=144查看數據庫權限(注意144就是字符”r“,也就是”root“的第一個字符):
Ps:有更好的unoin select user(),2,3 ;不用? 不是的,因為實戰(zhàn)中有的web不準用。用這個就可以來查看數據庫權限啦~ Ps:ord(),若字符串str 的最左字符是一個多字節(jié)字符,則返回該字符的代碼。(多字節(jié)。。有意思。。)
總結:這個information_schema數據庫是個特別強大的數據庫,里面包含的表很多,有SCHEMATAS(數據庫信息),TABLES(表信息),COLUMNS(列信息)等等。。。
總結
以上是生活随笔為你收集整理的黑客攻防之SQL注入原理解析入门教程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 自定义进度条_JAVA Swi
- 下一篇: VS2010 快捷键