1. 程式人生 > >sql註入tips

sql註入tips

註釋 ctf log 攔截 技術分享 執行 框架 哪裏 師傅

轉自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放出來了,其實要收集信息,要踩以下幾個坑:

  1. 通過不斷改變country,發現第一個點:country第一個字符會進行判斷,如果是大寫,不做改變,如果是非大寫英文字符,則ascii碼-0x20再轉換成字符存入庫中;

  2. Date是根據設置的時區的當前時間

  3. 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