这几天cg-ctf分数终于突破了800分大关,那么来适当的整理下思路与知识吧。
SQL注入1
先看题目跟源码
分析下源码,大致可以知道要求user为admin,对密码没有要求,因此绕过密码将其注释掉是肯定的了。但同时,发现$user跟$pass两个变量经过trim()函数处理,这个函数的作用是移除字符串两侧的空白字符或其他预定义字符。因此双引号里面的都被解析,可以不用闭合。
直接注入就好了,
得到flag
SQL Injection
查看源代码如下:
出现在源码中的clean()函数是我们调整注入语句的关键 ,而其中的 htmlentities()函数在很多安全书籍中有关注入的章节都有所出现。其功能视第二个参数而定,可以过滤掉单引号,双引号,或者兼而有之。因此,sql语句的闭合就成了问题,即我们不能用常规的单引号' 来进行闭合。
这时tip就派上用场了,因为 ‘\’反斜杠可以用来转义,所以注入时考虑使用反斜杠进行转义。
首先看sql语句
$query='SELECT * FROM users WHERE name=\''.$username.'\' AND pass=\''.$password.'\';';
首先反斜杠碰上单引号直接吞掉
所以语句实际为:
SELECT * FROM users WHERE name='.$username.' AND pass='.$password.';
我们要传的两个参数就在其中,考虑到闭合问题,先用反斜杠使$username无效化,就是说:
SELECT * FROM users WHERE name=' AND pass='.$password'
所以这里针对password的值也好说了,直接使sql语句中 or 1=1#就好;
所以构造出来的结果是:username=\&password=or%201%3d1%23
得到flag。
#这种注入技巧很不错,可以多理解一下其语句结构
密码重置
要求是:重置管理员账号:admin 的密码
首先记得先点下重置,,,(我其他步骤都是对的结果在这一步上出了问题。。。)
看到url中user1=Y3RmdXNlcg==,很容易想到是base64编码,转过来后发现是ctfuser
基于页面里的用户框不能更改,我们先把重置的url定下来,即user1='admin的base64编码'
即 http://nctf.nuptzj.cn/web13/index.php?user1=YWRtaW4=
然后看了下源码,确认了三个框的名字分别为 user, newpass, vcode
用fiddler传post请求:
flag也就出来了。