【网络空间安全】SQL Injection_SQL 注入...

联合查询 union

因为查询语句构造问题,可直接否认掉之前的查询,执行一个全新的语句来执行,需要注意的是查询的列应当与之前对应。

在MySQL中,把information_schema 看作是一个信息数据库,其中保存着关于MySQL服务器所维护的所有其他数据库的信息,如数据库表名,数据库的表,表栏的数据类型与访问权限

此数据库是MySQL自带的,information_schema.SCHEMATA表中的SCHEMA_NAME有着所有的数据库。

万能密码绕过登陆

通过在用户名处传入参数 ' or 1 = 1 # 进行万能密码登陆

在SQL查询语句中,where 条件中为检验username,往往要where username = '..'

此时如果在 ..后加上构造的参数,那么就会出现验证提前中断,并且换作一个或的条件

我们知道1 = 1 这个条件恒成立,username就跳过验证了,接下来,AND password = '...'

就自然而然的被 # 注释掉。

select * from users where username = '..'or 1 = 1 #' AND password = '...'

【上述 # 也可以换作 – 都是SQL注释】

数字型注入

输入参数为整数,如果存在注入型漏洞,则为数字型注入

字符型注入

与数字型注入的区别在于:字符型注入一般要用单引号或双引号来闭合

检测方法
..?id=8 and 1=1  【数字型】 --change--> ..? id=8' 【字符型】
..? user=admin' and '1'='1' 【字符型】

SQL盲注

不能通过直接显示的途径来获取数据库数据的方法。

在盲注中,攻击者根据其返回页面的不同来判断信息(可能是页面内容不同也可能是响应时间不同)

  1. 布尔盲注
  2. 时间盲注
  3. 报错型盲注

由于某些限制,布尔盲注的关键字带入不进去,这时候可以用slee来进行时间盲注,去页面执行时间,来判断sleep函数是否正常执行.

基于时间盲注在使用延迟函数上有两个选择,BENCHMARK(count,expr)函数,sleep(time)函数,前者通过将expr语句执行count次来达到延迟的目的,后者是直接延迟time时间.

某些查询是不需要返回结果的,仅判断语句是否正确执行即可,所以返回可以看作是一个布尔值,正常显示true,报错或者不正常显示为false.

SQL文件头注入

User-Agent:使得服务器能够识别客户使用的操作系统,浏览器版本,很多数据量大的网站终会记录客户使用的操作系统或者浏览器版本等存入数据库中

Cookie:网站为了辨别用户,进行session跟踪而储存在用户本地终端上的数据 , 通常经过加密

X-Forwarded-For:简称XFF头,它代表客户端,也就是HTTP的请求段真实的IP,通常一些网站的防注入功能会记录请求端真实IP并写入数据库or某文件。【通过修改XXF头可以实现伪造IP】

Rerferer:浏览器向web服务器表明自己是从哪个页面链接过来的

Host:客户端制定自己想访问的web服务器的域名/IP地址和端口号

  1. Cookie注入
  2. Refer注入
  3. UA注入
  4. XFF注入

宽字节注入

理想规范下,程序都使用unicode , 网站都使用 utf-8 ,但有些国家使用自己的编码,例如gbk,一个gbk编码的汉字占用两个字节,一个utf-8占用三个字节,简体中文系统中ANSI就代表GBK。

Scenes:
正常情况下通过输入单引号来探测有没有SQL注入漏洞
但由于使用了select函数或者其他字符转义函数,我们会在单引号前加反斜杠
如果我们构造的是`%df'`作为输入,在前面加上\,即`%df\'`,将会变成`%df%5c%27`
但gbk是两个字节表示一个汉字,所以`%5c变成汉字`
`单引号逃逸`,本来转义之后是不能作为特殊字符的
现在可以与前面的语句进行`引号闭合`,使得报错或者检测漏洞。
posted @ 2019-10-01 10:15  Roko&Basilisk  阅读(121)  评论(0编辑  收藏  举报