sqlilabs-Less 38~45&&Less 46~53


初探堆叠注入&&ORDER BY注入

一、叠堆注入

函数学习


查看源码;此时我们又遇到了新的函数;那咱们就来解读一下把!
1.mysqli_connect():打开一个到 MySQL 服务器的新的连接。
语法:mysqli_connect(host,username,password,dbname,port,socket);
host:可选;规定主机域名

username:可选;规定MySQL用户名

password:可选;规定MySQL密码

dbname:可选;规定默认连接的数据库

port:可选;规定连接MySQL服务器的端口号

socket:可选;规定socket或要使用的已命名pipe

那么socket是什么呢?我们要传送的数据就是物流中的货物,ip就是发货人和收货人的联系方式,大家想想这送货这这一流程还缺少啥?对呀,物流公司啊,对吧!物流公司就是那个Socket,他负责帮你处理送货的琐碎事情,比如你的货物该怎么打包、该怎么防止易碎物品破碎、该用什么方式运输、等等,如果是境外货物还牵涉到报关等等一系列复杂琐碎的事情,这些物流公司(Socket)帮你处理好了。

2.mysqli_select_db():用于更改连接的默认数据库。
语法:mysqli_select_db(connection,dbname)
connection:必选;规定使用的MySQL连接
dbname:必选;规定要使用的默认数据库

3.mysqli_multi_query():执行一个或多个针对数据库的查询
语法:mysqli_multi_query(connection,query)
connection:必选;规定使用的MySQL连接
query:必选;规定一个或者多个查询;中间用分号连接

4.mysql_store_result():用于将mysqli_query()查询的结果集存储到变量中

5.mysqli_fetch_row():函数从结果集中取得一行,并作为枚举数组返回。
语法:mysqli_fetch_row(result)
result 必选;规定由 mysqli_query()、mysqli_store_result() 或 mysqli_use_result()
返回的结果集标识符。

6.mysqli_more_results():检查一个多查询是否有更多的结果。
语法:mysqli_more_results(connection)
connection:必选;规定要使用的mysql连接

叠堆注入的原理:

在SQL中,分号 ; 是用来表示一条sql语句的结束。当我们结束一个sql语句后继续构造下一条语句,会不会一起执行?因此这个想法也就造就了堆叠注入。

与union select的区别:

区别就在于union select或者union all用来执行查询语句,而堆叠注入可以执行的是任意的语句;如增删数据
等对数据库造成伤害的语句。
原文:https://www.cnblogs.com/lcamry/p/5762905.html

堆叠注入触发条件

因为堆叠注入原理就是通过结束符同时执行多条sql语句,这就需要服务器在访问数据端时使用的是可同时执行多条sql语句的方法,比如php中mysqli_multi_query()函数,这个函数在支持同时执行多条sql语句,而与之对应的mysqli_query()函数一次只能执行一条sql语句,所以要想目标存在堆叠注入,在目标主机没有对堆叠注入进行黑名单过滤的情况下必须存在类似于mysqli_multi_query()这样的可以执行多条查询语句的函数。

而Less-38-45皆可以使用这种办法进行注入;只是闭合方式有所不同;或者对username进行一个过滤而已;这里就不细讲了。

二、Order By注入

一开始很疑惑为什么order by 也可以进行注入攻击;在参考了学长们的博客之后,有一种恍然大悟的感觉;
首先想问大家,到底何为注入?在我看来,就是我们插入的查询语句可以成功执行,并且页面有正确的回显信息;
所以综上所述;只要咱们插入的语句可以被带入数据库且执行;那么就存在注入点;也就是可以进行注入攻击。
好;接下来咱们阅读一下Less-46的源码

观察这个sql语句;不就是把我们输入的$id插入该sql语句,并进行一个查询吗;那么这不就是一个注入点吗?
只是该语句和我们之前遇到的sql语句不一样

之前的是where只不过现在换成了order by而已;回归本质;这还是一个查询语句;只是用法和我们之前的不一样
而已。order by后面的数字是一个可控的参数,我们可以利用这个来构造我们的语句,使sql语句被数据库执行

判读是否存在order by注入

?sort=1 desc 和 ?sort=1 asc;如果结果显示不同;则存在order by注入
注意:存在order by注入时不能有引号语句;就是无法使用union select语句;有union的时候,order by要以最后一个union为准,所以 order by必须放在最后一个union后面。

注入方法参考:报错注入和盲注

Less-46:
一.报错注入:
1:判断注入点:


一个降序一个升序;证明存在注入点。

二.一句话木马:

三.时间盲注
正确会有延迟;错误不会有延迟;但是因为使用时间盲注的话正确的话时间会延迟很多;与咱们设置的sleep时间不符合;所以翻看了学长们的博客;这是学长的解释:
(注意 sleep 是存在一个满足条件的行就会延迟指定的时间,比如sleep(5),但是实际上查找到两个满足条件的行,那么就会延迟10s,这其实是一个非常重要的信息,在真实的渗透测试过程中,我们有时候不清楚整个表的情况的话,可以用这样的方式进行刺探,比如设置成 sleep(0.001) 看最后多少秒有结果,推断表的行数)

less-47:单引号闭合;less-48:无报错,所以只能用时间盲注;less-49同上
less-50:数字型注入;less-51:单引号闭合,less-52:数字型盲注,less-53:单引号字符型盲注

至此sqli-labs靶场结束

思考与总结:


一、基础注入姿势:
1、判断参数名称和是数字型注入还是是字符型注入
2、若为字符型注入那么便探测其闭合方式
3、选择注入姿势
(1)若页面有显示位则选择联合注入
(2)若无显示位便考虑报错注入,使用报错语句进行探测;或者选择order by注入;
(3)若无报错注入便需要考虑盲注;盲注又分布尔盲注和时间盲注;若是页面有两种情况,一种为对,一种为错,
便采用布尔盲注;若是页面只有一种情况,便需要考虑时间盲注
注:关于此类基础姿势我已经在Basic Injection做过总结。

二、特殊注入姿势
1、针对请求头的注入
2、二次注入(存储型注入);利用我们插入的脏数据进行攻击
3、宽字节注入:遇到使用gbk编码的时候
4、叠堆注入;遇到mysqli_multi_query()函数时可以考虑
5、输入一句话木马进行提权
注:关于此类特殊注入姿势我也已经在Advanced Injections做过总结

三、防御注入的基础姿势
1、使用双服务器进行防御
2、过滤一些关键字符进行防御
3、添加\进行转义