sql註入tips
轉自http://www.wupco.cn/?p=3764
cuit
首先Web300 山水集團
第一步找到加密接口搭代理就不說了
接下來是註入,filter如下
這裏主要的難點在於如何按字節拆解返回的值,以完成按字節爆破盲註,waf攔截了我們常用的substr,like,left等函數,這裏我查了一下官方文檔,找到position函數。
通過position((str1)IN(str2))繞過空格的攔截,至於=用!(<>)繞過,然後形成最終payload
(1)or(!(position((%27user_name§b§%27)IN(select(group_concat(COLUMN_NAME))from(information_schema.COLUMNS)))%3C%3E1))
其實這種方法並不是最優解,看了官方的wp後,get到一個tip:
where中用於判斷的大於號,不僅僅是用於比較大小,對於字符串,也有比較的功能(按字節比較)
where中用於判斷的大於號,不僅僅是用於比較大小,對於字符串,也有比較的功能(按字節比較)
於是這道題就簡單了,完全不需要函數,直接利用這個來進行按字節的爆破即可
CST
感受俊傑師傅的恐怖吧!
這裏我說一下其中一道題,有兩個參數,一個是table,一個是id,然後在id裏存在盲註,但是有waf,不過報錯註入還是挺輕松的。
但是恐怖的事情來了,waf攔截了column這個字符串,也就是說我們無法拿到字段名(column_name,columns等都無法使用)
過了一會,我找俊傑師傅要了一下hint,table是可以註入的,而且沒做任何waf
但是之前試過對table進行修改,改成除了flag和news的都提示表錯誤,結合hint是可以註入,又試了好多根本猜不透語句是怎麽寫的,後來找師傅要了語句。
這個desc真的沒想到.......一直以為是和tctf那道CI框架的題一樣,先select出表名,進行檢測,然後再執行最終sql語句。
然後師傅又甩我個雨牛博客
http://www.yulegeyu.com/2017/04/16/%E5%BD%93%E8%A1%A8%E5%90%8D%E5%8F%AF%E6%8E%A7%E7%9A%84%E6%B3%A8%E5%85%A5%E9%81%87%E5%88%B0%E4%BA%86Describe%E6%97%B6%E7%9A%84%E5%87%A0%E7%A7%8D%E6%83%85%E5%86%B5%E3%80%82/
最終我的payload是
http://114.55.36.69:20680/index.php?table=flag`%20`i%&id=3
利用通配符%進行按字節爆破,搞出了字段名,最後用報錯註入拿到flag。
但是俊傑師傅馬上甩我一個更簡單的payload,如下
http://192.168.20.133/index.php?table=flag`%23` where 0=extractvalue(1,(select group_concat(0x3a,column_name) from information_schema.columns where table_name=‘error_flag‘))%23`&id=1
這句在desc一句中變成
desc `error_flag`#` where 0=extractvalue(1,(select group_concat(0x3a,column_name) from information_schema.columns where table_name=‘error_flag‘))#``
#直接註釋掉後面的內容,然後這句正常返回error_flag的所有字段。
放在下面的select語句中變成
select * from error_flag`#` where 0=extractvalue(1,(select group_concat(0x3a,column_name) from information_schema.columns where table_name=‘error_flag‘))#`
`#`剛好作為alias,後面直接報錯註入出字段名
某校校賽/WCTF
這道題我只做了第一步,註入部分。
邏輯如下:
首先是註冊,其中country字段在前端是option 用戶進行選擇的
然後是login登陸,到userinfo裏有三個信息
這裏我直接把最終payload放出來了,其實要收集信息,要踩以下幾個坑:
-
通過不斷改變country,發現第一個點:country第一個字符會進行判斷,如果是大寫,不做改變,如果是非大寫英文字符,則ascii碼-0x20再轉換成字符存入庫中;
-
Date是根據設置的時區的當前時間
-
waf很強大,先不說過濾了什麽,能使用的只有‘,@,(,),還有一些沒啥用的可見字符。
第一點,對於普通的英文字符沒什麽用,無非是字符的大寫轉化,但是對於符號就不一樣了,這裏通過觀察可以發現,數據是經過addsalashes處理的,如果我們傳入‘xxx,‘通過轉義變成/‘,然後經過第一點的規則變成<‘,成功閉合了單引號。
但是後面的語句怎麽註釋掉呢?#和空格都被waf攔截。
這裏雨牛的博客有個tip
http://www.yulegeyu.com/2017/04/11/%E4%B8%BA%E4%BB%80%E4%B9%88-backtick-%E8%83%BD%E5%81%9A%E6%B3%A8%E9%87%8A%E7%AC%A6/
`在php-mysql裏可以被自動閉合,也就是我們可以找到一個使用alias或者使用列名的地方,利用這一個tip去註釋掉後面的內容。
構造出來的最終payload是
country=‘and(1=2)and(1)=@`
和
country=‘or(1)or(1)=@`
是bool型註入,但是有哪裏不一樣呢???
這就要考驗眼力了,註意到date裏面,如果是使用or(1),采用是時區就是默認時區,最後的時間和中國的時間保持同步,如果是and(1=2),則采用不知道是哪國的時區,和現在時間差距很大。
這裏我猜測中間有一條sql語句專門來判斷選擇時區的。
所以通過這個,一個二次註入(bool盲註)就達成了,註意不能使用空格,用括號來繞過就ok了
sql註入tips