sqli-labs(11-20)
Less-11 POST-Error Based-Single quotes -String
突然换界面有点不适应
用火狐的hackbar总是没反应或者报错500,改用burp,登陆成功
order by 3
报错
order by 2
返回登录成功页面
所以,字段有俩,使用-1'union select 1,2
,发现1,2均输出
接下来的操作和Less-1,less-2雷同,就不继续了
Less-12 POST - Error Based - Double quotes- String-with twist (基于错误的双引号POST型字符型变形的注入)
经过多次尝试,发现是("")
类型
找出字段有几个
字段名有2个
字段1,2可以输出结果
接下来就是查询数据库名,表名,字段名,然后获取数据库内容,略
Less-13 POST-Double Injection-Single Quotes-string- with twist
输入'后报错
推测为('')类型,报错里证明了这一点
登录成功,但是没有输出任何信息
意味着需要利用报错来获取信息
采用报错注入:
-
通过floor报错(floor()取整)
and (select 1 from (select count(*),concat(( payload),floor(rand()*2)) as x from information_schema.tables group by x)a)
该语句将输出字符长度限制为64个字符 -
通过updatexml报错
and updatexml(1,concat(0x3a,payload,0x3a),1)
该语句对输出的字符长度做了限制,其最长输出32位
并且对payload的返回类型也做了限制,只有在payload返回的不是xml格式才会生效 -
通过ExtractValue报错
and extractvalue(1, payload)
输出字符有长度限制,最长32位。
payload即我们要输入的sql查询语句
获得数据库名
获取表名,但是超长了,使用limit也超长
我发现在最后再加一个limit,就不超长了,很神奇
获取user表名
接下来就是获得字段名,然后获取数据,略过
Less-14 POST-Double Injection-Double Quotes-string- with twist
先用单引号试探,没有报错
再用双引号试探,报错
看来变量是被双引号包裹
构造payoad登录成功,但是没显示任何信息
看来还是需要用报错注入
方法和Less-13一样,不过要把单引号换成双引号,然后把单引号后面的)去掉
获得密码字段名
获得密码,竟然还是明文
Less-15 POST-Blind-Boolian/Time Based -Single Quotes
好家伙,不显示错误提示了,只写登录成功和失败
没事,可以用布尔注入
判断数据库名长度
接下来就是熟悉的爆破环节了,(有一说一,社区版的burp suite爆破好慢,有些功能还用不了,改天换专业版)
然后判断表名长度,接着爆破,获得表名
判断字段名,爆破
判断密码长度,爆破
Less-16 POST-POST-Blind-Boolian/Time Based -Double Quotes
经过几次测试,发现是("")
类型
同样是bool型注入,与Less-15相同,就略过了
Less-17 Update Query-Error based -String
什么情况?
bug off you silly dumb hacker???你才憨批
在password上构造就成功了,显然没有过滤
在password中输入'报错
可以采用报错注入,接下来尝试是否成功,果然成功了
接下来获得表名字段名等略过
Less-18 Http头注入-User-Agent-报错注入
打开页面,显示我的IP,什么情况?
无论怎么输入,都没反应,把我整懵了,难道是通过显示ip来注入?
查了一下,要对http head注入
在写网站代码的时候,编程人员会用到对应的函数,对用户提交的参数进行过滤。但是对于http头中的提交的内容可能没有进行过滤。例如http头的User-agent、Referer、Cookie等,所以就会产生http头注入的情况。
可以看到该网站的http头有如下内容
- host:指定被请求资源的Internet主机和端口号
- User-Agent:将客户端的操作系统,浏览器等其他属性告诉服务器
- Accept:指定客户端接受那些MIME类型的信息
- Accept-Language:指定客户端接受的类型
- Accept_Encoding:指定客户端接受的编码
- Refer:用户从哪个页面过来的
- Content-Type:向接收方指示实体的介质类型
- Content-Length:指明实体正文长度
常见的HTTP注入点产生位置为【Referer】、【X-Forwarded-For】、【Cookie】、【X-Real-IP】、【Accept-Language】、【Authorization】;
(1)HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器基此可以获得一些信息用于处理。
(2)X-Forwarded-For:简称XFF头,它代表客户端,用于记录代理信息的,每经过一级代理(匿名代理除外),代理服务器都会把这次请求的来源IP
追加在X-Forwarded-For
中
(3)Cookie,有时也用其复数形式 Cookies,指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密)
(4)X-Real-IP一般只记录真实发出请求的客户端IP,看下面的例子,
X-Forwarded-For: 1.1.1.1, 2.2.2.2, 3.3.3.3
代表 请求由1.1.1.1发出,经过三层代理,第一层是2.2.2.2,第二层是3.3.3.3,而本次请求的来源IP4.4.4.4是第三层代理
如果配置了X-Read-IP,将会是:
X-Real-IP: 1.1.1.1
所以 ,如果只有一层代理,这两个头的值就是一样的
(5)Accept-Language请求头允许客户端声明它可以理解的自然语言,以及优先选择的区域方言
还是不太懂,看一下源码:
对用户名和密码进行了过滤
不过没有对useragent过滤
所以可以在user-agent进行注入
怎么注入呢?由源码可知,输入了正确的用户密码后才能将user-agent的内容显示出来,怎么获得用户名和密码这是一个问题.
密码不知道怎么获得,我太菜了.
查了数据库,得到了一个用户名和密码,输入后显示user-agent
它报错了,接下来可以报错注入
试了半天怎麽都注入不出来,后来发现需要构造三个参数,因为插入了三个参数,uagent,ip,username
构造1',1,updatexml(1,concat(0x3a,database(),0x3a),1))#
,终于成功了
爆表名,好吧,它太长了
用limit限制
接下来的套路就略过了
Less-19 Http头注入-Refer-报错注入
登录账户后没有反应,怎么回事
随便输入则显示登录失败
不知道咋回事,先看一看源码
对用户名和密码检查
登录成功后将refer插入,然后输出.发现有一句话用的mysql_query()
难怪登录成功后不显示信息
改成mysqli_query后,页面正常了
获得数据库名
接下来步骤略过
Less-20 cookie注入-报错注入
登录账户,显示下面的东东,怎麽回事呢?
仔细看这一条,它返回了我登陆后的cookie
看看源码:登录后将用户名设置位cookie,生命周期为1h
但是,这个cookie有注入点吗?请看下面的源码
将设置的cookie带入到数据库中查询
说实话,这个源码也许单纯是为了让练习才刻意这样写的,看的我一愣一愣的
看懂了源码,明白了接下来的操作:修改cookie值就完事了
使用cookie editor编辑cookie
将cookie值修改为'看看,报错了,嗯,这正是俺想看到的
改成1' and 1=1#,什么??它骂人...
字段名为3
可用字段名为2,3
爆数据库名
害,接下来就略过吧,老套路了