今天遇到了一个order by的mysql盲注,发现order by注入和普通的select注入有很多不一样的地方,下面以该注入点为实例讲解一下order by的注入技巧。
ps:order by注入也是分报错注入和盲注的,由于该注入点是盲注,所以首先讲解一下order by盲注,后面讲解一下order by报错注入的利用代码。
一、order by盲注
1、注入点
challenge-4.php?orderby=id challenge-4.php?orderby=domain
通过上面页面可以看到结果根据orderby参数的不同发生了顺序变化,所以orderby参数点可能存在order by注入的可能。
2、注入点确认
确认orderby参数是否存在order by类型的注入,不能使用普通的select注入点使用的and 1=1或’ and ‘1’=’1语句进行注入判断。判断方法是在后面加上asc或desc来判断,如果asc和desc返回的页面内容的顺序不一样,那么可以初步判断该参数是order by使用的参数,只有order by语句使用的参数才可能会存在order by注入。
(1)判断参数是否被order by使用
ctf/challenge-4.php?orderby=id%0Aasc ctf/challenge-4.php?orderby=id%0Adesc
返回页面内容顺序不同的话,那么可以判断该参数是被order by语句利用了的。
ps:因为查询语句中即使在order by中使用了该参数作为排序,但有可能asc或desc已经内嵌在查询语句中,因此通过在参数后添加asc或desc来判断参数是否被order by使用是存在误判的,因此在实际使用过程可以直接使用(2)进行order by注入判断。
(2)判断是否存在order by注入
/ctf/challenge-4.php?orderby=if(1<2,id,domain) /ctf/challenge-4.php?orderby=if(1>2,id,domain)
或者
/ctf/challenge-4.php?orderby=null,if(1<2,id,domain) /ctf/challenge-4.php?orderby=null,if(1>2,id,domain)
3、获取数据
上面注入点判断存在order by注入后就可以通过该注入点获取数据了,因为该注入点是盲注类型,所以只能通过substring()结合burp来进行数据获取。
payload:
ctf/challenge-4.php?orderby=null,(if(ord(substring(database(),1,1))=119,domain,id))
二、order by报错注入
order by报错注入的话比order by盲注要简单些,因为可以根据错误信息来获取信息,普通的select报错注入都可以使用。
payload:
http://localhost/Example/sqli/orderby.php?id=id,(select%201%20from%20(select%20count(*),concat(user(),floor(rand(0)*2))x%20from%20information_schema.tables%20group%20by%20x)a)--+
参考资料:
2、Finecms一处代码引发多处SQL注入(Order by注入技巧)
3、Mysql 下 Insert、Update、Delete、Order By、Group By注入
Insert、Update、Delete、Order By、Group By注入的常见利用方法可以查看:Mysql 下 Insert、Update、Delete、Order By、Group By注入。
转载请注明:jinglingshu的博客 » mysql order by注入技巧及其他注入(Insert/Update/Delete/Group by)