安全的攻與防一直永不過期的話題。
正如你***的某個網站,也許某一刻由於各類技術條件限制,你沒法很好對其進行***,可是隨着本身的成長以及研究。總會有些意想不到的小驚喜在等着你。
上一週,本身手上有很多的任務,因此前三天是論壇上的,後兩天則去作本身手頭上的事情。在***一個網站的時候,發現了一個數字型的注入點,正準備利用的時候。Duang,安全狗彈出來了。
那天手上的任務不算太多,就打算手動測試一下,思考怎麼去繞過安全狗(( ω ))。
那麼下面來說述個人故事吧!
(1)尋找到一個疑似數字型的注入點
訪問網站以後,我對帶id參數的url進行手工測試。發現有一個url的id參數有問題。
首先是正常的url,返回的頁面以下圖。
以後我簡單的遍歷一下id這個參數,當id=1的時候。頁面長這個樣子。
而後我開始驗證是否可能存在注入點,通常對於這種數字型的參數。咱們經過原id數值加減乘除另一個數值,而後對比運算後的結果的頁面與對應id頁面是否同樣。簡單來講,要是id=37-36這個頁面和id=1頁面長的同樣,咱們能夠猜想這裏可能存在一個注入點。
而後將id參數變換成id=37-36,以下圖。能夠發現這個頁面徹底和id=1如出一轍。
(2)而後我使用order by [數字]來肯定當前select語句的列數的時候,數據庫報錯了。以下圖。
由上圖咱們能夠看見,原來後臺的sql語句已經帶有order by,那咱們--+(在url中+表示空格)註釋它好了。能夠看到頁面又和id=37的同樣了。
以後和常規同樣,咱們使用union select 1來獲取數據。可是現實狠狠的給咱們一個耳光,網站有安全狗。以下圖
以後,樓主開始測試了,想想用%0a(對應着換行符)。不過好像並無什麼卵用。以下圖
那咱們試試空字符%00,這個在不少場合有神奇功能的字符。好像有用耶,網站返回報錯信息,以下圖。
咱們能夠看到37和union之間沒有空格。咱們加上一個空格看看。以下圖,後臺仍是報錯了,報錯信息和以前同樣,這說明%00這個符號在sql查詢語句會有問題,那咱們怎麼辦呢?
咱們將%00放在什麼位置,對於sql語句是沒有影響呢?我想機智的你會想到mysql的多行註釋,咱們只須要將%00放在/**/之間,mysql將會對%00視而不見。那咱們來看看實際的結果。
從上圖能夠看到,返回的錯誤信息不同了。熟悉sql語句的同窗會知道,這是在告訴咱們咱們union前面的兩個select 語句不同,這時候咱們仔細觀察一下,這裏select 的列數變成了三列,和咱們第一次測試的不同。以下圖,下面是咱們第一次union的測試,能夠看到這裏只有一列。也就是說這個id參數用在了兩次不一樣的查詢,意味着咱們沒法經過union select在獲取數據了。
如今咱們來理清一下思緒:
第一次select語句爲: SELECT count(id) as c FROM `hdm0550293_db`.`m16_news` WHERE cid=37/**/union select 1,2,3-- LIMIT 1
第二次select語句爲: SELECT `id`,`title`,`pic` FROM `hdm0550293_db`.`m16_news` WHERE isdisplay=1 AND cid=37/**/union select 1-- ORDER BY sort desc,id desc LIMIT 0,9
(3)既然union沒法利用,那咱們如今能夠利用的技術爲報錯型注入與布爾盲注。
[1]咱們測試updatexml(1,concat(0x7e,user()),0)
[2]咱們測試extractvalue(1,concat(0x7e,user()))
[3]咱們測試or (select count(*) from information_schema.tables group by concat(user(),floor(rand(0)*2))),以下圖。:-O,個人天呀,咱們想要的數據出來了。
獲取當前數據庫,or (select count(*) from information_schema.tables group by concat(database(),floor(rand(0)*2)))
可是在獲取數據表名的時候,狗狗仍是檢測到這種。
(select count(*) from information_schema.tables group by concat((select table_name from information_schema.tables where table_schema=database() limit 0,1),floor(rand(0)*2)))--+
可是,咱們起碼已經一步步的繞過來,咱們突破了它的幾個防護點。因此爲本身點個贊。
[2]固然咱們也可使用盲注技術來獲取數據,但是一些常見的列表名仍是會被封禁。下面是我在寫盲註腳本跑出的庫名。
(4)後來答主本身在本地環境安裝了最新的apache版的安全狗。
咱們來測試測試,新版本是否可使用%00。
[1]首先,咱們先看一下咱們發現問題的站點。使用/*%00*/and 1=1能夠正常返回頁面mysql
而看一下我本地環境,最新版的安全狗。這樣是沒法經過的。
很惋惜,這個%00符號,最新版的安全狗是檢測的,可是爲何目標站點沒反應呢?
能夠看到安全狗有個選項,在線更新防禦規則。安全狗對於新出來的注入是經過規則來匹配的,而不少網站覺得裝了安全狗就安然無恙了。卻不知缺少管理,對安全的不做爲,致使了他們即便有了waf,也會致使本身網站遭受***的***。
(5)寫在最後,網站是須要維護和管理的。時刻注意着系統和軟件的更新,不要想着有什麼銀彈。本身的不做爲,什麼安全軟件也沒法幫助你。之前樓主看到安全狗也是很鬱悶的,可是通過這一次分析,發現人的不做爲每每給咱們留下了機會。因此遇到安全狗,就去嘗試繞過,也許你遇到的那個就是不做爲的管理員。
(6)這個週末沒有運動,嗚嗚!本來星期天打算去玩的,哎,今晚拿來寫帖子了,好累的趕腳。點讚的不要吝嗇啦。下次真的得考慮一下錄個視頻,否則寫個帖子,我竟然花了3個小時。sql