前言
我曾自诩是个密码手,慢慢地发现是在歪门邪道的摸索路上越走越远。
sql注入
前期基本靶场环境
phpstudy_pro下的靶场。
前置知识
sql语句等
数字型注入与字符型注入
输入的参数是整形时,可认为是数字型输入;输入的参数是字符串时,成为字符型输入。
判断数字型注入与字符型注入:
打开源代码,若是字符型注入,后台查询的语句大概为:
其中$id指输入的内容,假设输入的是 1 and 1=1,对应的语句里则是 id=’1 and 1=1’,and在引号里被当字符串处理,无法发挥连接作用,两边的引号是闭合符,该语句就是单引号闭合语句
若是数字型注入,后台查询的语句大概为:
此时如果提交and语句,如 id= 1 and 1=1,and发挥连接作用。数字型不需要闭合符来闭合。
根据上述的区别可以判断是数字型注入还是字符型注入。
闭合方式和判断:
常见的闭合方式: ‘ ” ‘) ”) 其它
判断闭合方式:
eg.
输入?id=1”’,报错为near 1””多一个’则闭合符为’
输入?id=1”’报错为near 1””)多一个’)则闭合符为’)
闭合的作用:手动提交闭合符,结束前一段查询语句,后面可加入其它语句查询需要的参数,不需要的用注释符注释掉。
常见注释符:’- -+’ 或 ‘#’ 或 ‘%23′ ,不一定都适用,比如有的语句可以用’- -+’进行注释而换成’#’注释就不行。
union联合注入
union使用前提,表的列数一致,所以先用group by/order by二分法判断默认页面数据列数量。
之后便可以联合注入
假设数据列数量为3
Eg. $sql=”select * from users where id=’1′ union select 1,2,3 ” (因为数据列数量为3,所以后面union后要跟三个数字或者三个字符)
注意:回显只能显示出第一行
对应的后台执行操作:
如果不想显示id=’1’行的数据,可以尝试输入的参数值为0或负数,注意哪些位置可以回显,(即union后输入的数字或字符哪些具有回显位)进而进行一系列操作,如查询数据库名database() 查询版本号version()等。
局限性:如果SQL文内有换行,或者调用的存储过程,注释符就会失效。