一、SQL注入介绍
1、SQL注入简介
SQL注入是指web应用程序对用户输入数据的合法性来进行判断、处理,前端传入的参数是攻击者可控的,并且参数被正常的带入到数据库查询,攻击者可以通过构造不同的SQL语句来进行对数据库的操作,正常情况下,攻击者可以对数据库进行高危操作,例如,数据查询、WebShell写入、命令执行等操作。
==注意:SQL注入需要有SQL语言的基础,SQL语言基础后续会发布文章,实际操作会发布在sql-lib文章中。==
2、SQL注入原理
SQL注入漏洞的产生需要满足以下两个条件:
- 参数是用户可控的,也就是前端传入后端的参数的内容是用户可以控制的。
- 参数被带入数据库进行查询,也就是传入的参数被拼接到SQL语句中,并且带入到数据库进行查询。
3、注入判断
当传入的参数为1'时,数据库会执行以下代码并会报错,这是因为不符合数据库语法规范的。
当传入的参数为and1=1时,不会报错,因为1=1为真,所以返回的页面是正常的,当传入参数为and1=2时,因为条件为假,所以会返回一个不同的结果。
==注意:回显是指页面有数据,信息返回,无回显是指根据输入的语句页面没有任何变化,或者没有数据库中的内容显示到网页中。==
4、SQL注入流程
判断是否存在注入并且判断注入类型
- 判断字段数order by
- 确定回显点union select 1,2
- 查询数据库信息@@version @@datadir
- 查询用户名,数据库名 user() database()
- 文件读取union select 1,load_file(‘C:\windows\win.ini’)#
- 写入webshell select .. into outfile ...
==如果使用sql注入时遇到转义字符串的单引号或者双引号,可以使用HEX编码绕过。==
5、SQL注入的危害
- 数据库信息泄露:泄露数据库中存放的数据,用户隐私等。
- 获取webshell:当权限为root且知道绝对路径时,可以直接写入一句话木马到服务器。
- 网页篡改:注入出后台管理员用户,登录后台发布恶意数据,篡改后台数据。
- 网站挂马:当拿到webshell或者获取到服务器权限后,可以将一些网页木马挂在服务器上,去攻击。
- 获取系统权限:当权限足够高,可以获取系统主机的权限。
- 万能密码:利用特定的payload登录后台或其它页面。
- 文件读取:读取敏感信息。
二、SQL注入类型
1、简单分类
- 安装数据库类型分类 Access、MsSQL、MySQL、Oracle、DB2等
- 按照提交方式分类 GET、POST、cookie、HTTP头、XFF
- 按注入点类型分类 数字型、字符型、搜索型
- 按执行效果分类 布尔盲注、时间盲注、报错注入、联合注入、堆叠查询注入
2、数字型注入
在web端大概是http://xxx.com/news.php?id=1 这种形式,其注入点ID类型为数字,所以叫数字型注入点。这一类的SQL语句原型大概为select * from 表名 where id=1。
==简单来说就是最直白简单的一种注入方式。==
3、字符型注入
在web端大概是http://xxx.com/new.php?name=admin 这种形式,其注入点name类型为字符类型,所以叫字符型注入点。这一类的SQL语句原型大概为select * from 表名 where name= ‘admin’ 。
4、搜索型注入
一些网站为了方便用户查找网站的资源,都对用户提供了搜索功能,因为是搜索功能,往往是程序员在编写代码都忽略了对其变量(参数)的过滤,而且这样的漏洞在国内的系统中普遍存在。
==可以在皮卡皮卡网站进行练习。==
5、布尔盲注
即可以根据返回页面判断条件真假的注入。
==关键在于if(a,b,c),如果a为真,返回b,否则返回c。==
6、时间(延时)盲注
即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。
==关键也在于if(a,b,c),但在这里,b一般为sleep(5),也就是说,a为真,则延迟五秒返回,否则马上返回。==
7、报错注入
即页面会返回错误信息,或者把注入的语句结果直接返回在页面中。
==有三个函数,extractvalue注入,updatexml注入,floor注入。==
8、二次注入
==原理是在第一次查询中,将我们后面所需的内容插入进去,在第二次注入的过程中用到他,实现我们的目的。==
9、联合注入
可以使用union的情况下注入。
==union可以用于很多注入方式中。==
10、堆叠查询注入
可以同时执行多条语句的执行时的注入。
==具体请见实操,实操文章发布后会在此链接。==
11、Cookie注入
==具体请见实操,实操文章发布后会在此链接。==
12、Referer注入
==具体请见实操,实操文章发布后会在此链接。==
13、DNS外带
在实际的应用场景中,我们一般在进行SQL盲注时,为了效率,在load_file()函数未被禁用的情况下,我们可以结合一些dnslog平台,进行外带注入。
不管是布尔类型盲注还是时间盲注,都需要发送大量的数据包去判断数据,而这很可能会触发WAF的防护,因此导致IP被封,所以,如果条件允许,我们可以结合DNslog来快速的回显数据。MySQL数据库,通过DNSlog盲注需要用到load_file()函数,该函数不仅能加载本地文件,同时也能对URL发起请求,因此需要使用load_file()函数,需要root权限,并且secure_file_priv需要为空。
==注意:利用原理是将dnslog平台中的特有字段payload代入目标发起dns请求,通过dns解析将请求后的关键信息组合成新的三级域名带出,在dns服务器的dns日志中显示出来。==
14、窄字节和宽字节
1、宽字节介绍
- 当某个字符的大小为一个字节时,称其字符为窄字节
- 当某字符的大小为两个字节时,称其字符为宽字节
- 所有英文默认占一个字节,汉字占两个字节
- 常见的宽字节编码:GB2312,GBK,GB18030,BIG5,SHIFT_JIS
2、宽字节注入原理
- 程序员为了防止sql注入,对用户输入中的单引号(')进行处理,在单引号前加上斜杠进行转义,这样被处理后的sql语句中,单引号不再具有作用,仅仅是内容而已。
- 而安全人员要绕过这个转义处理,使单引号发挥作用,有两个思路:==1、让斜杠失去作用。2、让斜杠消失。==
- 思路一:借鉴程序员的防范思路,对斜杠进行转义,使其失去转义单引号的作用,成为内容
- 思路二:宽字节注入。当使用MySQL使用宽字节编码,如GBK时,两个连在一起的字符会被认为是汉字,我们可以在单引号前加一个字符,使其和斜杠组合被认成汉字,从而达到让斜杠消失的目的,进而使单引号发挥作用。==注意:前一个字符的Ascii要大于128,两个字符才能组合成汉字,如%df%5c%27,此时%df和%5c会被GBK认为是一个汉字,也就是繁体字運,而后面的%27也就是单引号('),这样就绕过了闭合问题。
==具体请见实操,实操文章发布后会在此链接。==
三、总结与心得
SQL注入虽然分为了很多种类型,但他们的存在是平级关系,并不存在哪种注入优先级高,只能说具体问题具体分析,针对不同的网站,可能会有多种方式适用,所以碰吧,时间+努力=幸运。
==具体请见实操,实操文章发布后会在此链接。==