一、sql注入基础整理
1)SQL注入原理
SQL注入是把恶意的 SQL 查询或添加语句插入到web界面的输入参数中,后台对输入参数的不严格过滤导致数据库内容被修改或输出,它目前黑客对数据库进行攻击的最常用手段之一。
2)SQL注入的常见类型
1、注入点
有常见的sql注入的注入点,也就是说这些地方有可能会传入参数到后端,然后可能会有后端执行对数据库的操作引用我们输入的参数
a、COOKIE
这个注入我们在url上看不到注入点,所以一般这个先是对这个网页进行抓包,然后得到包后看到这个包中的cookie上由id=1之类的就可以猜测是cookie注入
b、GET
这个是在url上可以直接写的?id=(写在url上说明id这个在后面的php上是GET方式得到)
c、POST
这个就不能写在url上,可以抓包然后将输入放入,也可以用hackbar中post输入,然后和get类似了
2、注入方式
a、简单注入
简单的注入也就是说后端程序没有把我们输入的内容进行任何过滤,并且会返回数据库的内容,当我们输入一些查询其他内容的sql语句就可以直接通过web界面原有的返回数据库信息的渠道得到一些原来得不到的信息
简单注入的基本流程:
1,查看闭合方式(使用单引号和双引号来判断)
2,查看注入类型(是字符型注入还是数字型注入)
3,判断查询列数(使用group by或者order by)
4,判断回显位(构造一个新的查询语句来判断)
5,根据上面的信息来构造恶意的sql语句来获取数据库信息
b、报错注入
报错注入基本原理是当我们输入一些特殊字符,后端在执行时,会把数据库报错的信息返回给攻击者,然后攻击者可以根据返回的报错信息来进一步的构造语句或者得到数据库信息
报错注入常见函数:
1 2 3 4 5 6 7 8 | 1 extractvalue()
注入语句示例: id = 1 " union select 1 ,extractvalue( 1 ,concat( 0x7e ,(select database()))), 3 - - +
2 updataxml()
注入语句示例:? id = 1 ") and 1 = updatexml( 1 ,concat( 0x7e ,( * * select group_concat(table name) from information_schema.tables where table_schema = database() * * )), 3 ) - - +
3 floor()
注入语句示例:? id = 0 ' union select 1,count(*),concat_ws(' - ',(**select group_concat(username,' :',password) from users * * ),floor(rand( 0 ) * 2 )) as a from information_schema.tables group by a - - +
|
想要查询什么就修改星号内的内容
注入流程:
输入特殊字符发现返回错误信息,然后就可以根据信息构造新的语句
选择合适的注入函数
c、布尔盲注
布尔盲注原理:与报错注入和简单注入不同,这里不会显示任何信息,只会显示是否正确,如果正确就回显一个界面,错误就回显另一个界面,可以通过根据回显的内容来判断我们输入的内容是否错误
这也就意味这这种方式非常繁琐,需要进行非常多的判断,可以利用burpsuite来进行爆破是一种不错的选择
1>简单盲注
简单的盲注流程:
1,判断闭合方式
2,构造判断类型的语句来得到数据内容
1 | 示例: and length(database()) = 8 - - + / / 这里就是用判断语句来不断得到数据库的长度
|
如果正确就会返回正确的界面,但如果错误就会显示错误的界面
通过这种不断判断的方式来得到数据库的详细信息
2>时间盲注
这里是使用特殊函数sleep()来进行构造sql语句的
和上面的盲注过程类似,最后构造的语句是不通过回显内容来判断的是否正确,而是使用回显的时间或者响应的时间来判断的是否正确的
1 | 示例: id = 1 ' and sleep( 5 ) - - + / / 这里是用sleep这个语法来时间盲注
|
如果是正确的那么服务器会休息5秒在返回内容,这样就可以判断数据库内容了
d、堆叠注入
堆叠注入原理是输入参数没有过滤“;”,从而可以输入分号来隔绝上一条查询语句并构造一条新的查询语句
1 | 示例:? id = 1 ');update user set password=' 1234 ' where username=' Dumb'; - - +
|
其中我们就直接插入了一些update修改数据库内容,这样就类似直接写了一条代码在后端让后端执行。
e、二次注入
这里和前面的原理就有些不同了,上面是在一个位置进行注入查询语句
这里是通过不同的页面来进行注入,例如注册了一个账号,通过注释符等一些操作从而达到注册了一个新的账号,但可以通过其他界面修改新的账号密码来修改原先有的账号密码。
这里就用SQLi-Labs靶场的第24关来进行举例二次注入
那么先创建一个账号
![图片描述](upload/attach/202404/997591_ZVJXQQ6PNVEU8NK.webp)
这个账号一注册发现是已经注册过的账号了
![图片描述](upload/attach/202404/997591_QMBP4TFC52SZGUN.webp)
那么给注册的username加一个单引号看看
![图片描述](upload/attach/202404/997591_8BRDZKUKZRBXHET.webp)
注册成功
然后登入试试
![图片描述](upload/attach/202404/997591_9RMFNS2SSTPAQEA.webp)
登入后可以看到账号是admin‘,然后相关操作是修改密码
那么给这个试着修改密码
![图片描述](upload/attach/202404/997591_9732WZK72CTVF2K.webp)
这个账号怎么都修改不了密码
那就注册过一个账号
这一次就注册了一个admin’ #的账号
发现也能注册
![图片描述](upload/attach/202404/997591_MRFMKBWTAG6FCJY.webp)
然后将admin' #的密码给修改
发现修改的是admin的密码
然后就可以登录admin的账号了
![图片描述](upload/attach/202404/997591_HQM94HZJUHQQRF7.webp)
f、宽字节注入
这里其实就是当我们输入单引号或者双引号的时候会被反斜杠转义,这样会导致转义后的内容不会被执行
所以我们可以使用宽字节来绕过反斜杠转义的方法
就是输入一个%df就可以了在单引号前面
1 | id = - 1 % df' union select 1 , 2 , 3 - - +
|
3)常见注入绕过方式
1、双写绕过
有的时候后台检测到危险函数的时候会通过将危险函数替换成空字符来规避风险
这个时候就可以使用双写绕过来绕过替换
1 2 3 | 例: id = 1 " union select 1 , 2 , 3 - - + / / 其中union 和select被过滤了
id = 1 " uniunionon selselectect 1 , 2 , 3 - - + / / 这样就可以绕过了
|
2、大小写绕过
当后台检测并不是正则匹配大小写的时候可以使用
1 2 3 | 例: id = 1 " union select 1 , 2 , 3 - - + / / 其中union 和select被警告说不能使用
id = 1 " UnIon SeLect 1 , 2 , 3 - - + / / 可以试试使用大小写绕过,这里的大小写是随便哪个字母
|
3、空格过滤绕过
有的时候后台会直接把空格给过滤了,这时候我们输入的语句就没法分割开,所以得想办法找到一个可以替换空格的字符
这里可以使用
4、内联注释绕过
1 | id = - 1 ' / * !UnIoN * / SeLeCT 1 , 2 , 3
|
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课