您当前的位置: 首页 >  sql

ThnPkm

暂无认证

  • 2浏览

    0关注

    98博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

sql-lab (3)

ThnPkm 发布时间:2022-08-16 23:35:05 ,浏览量:2

Less21 Cookiec处base64

 

cookie 处 base64编码 

Less23(过滤注释符) 

-- # 等注释符过滤了,就用单引号' 来闭合后面的' ,形成注释效果

 

 

 Less24 二次注入

Less 24(二次注入)_老司机开代码的博客-CSDN博客

 登录表单,有忘记密码和注册账号

注册一个ThnPkm 123456 然后登录进来了

原理:

二次注入(存储型注入),这种手法所利用的原理是:在网站处理用户提交的数据的时候,只是将某些敏感字符进行了转义。因而使得用户第一次提交的时候不会被当做代码执行。但是这些数据存入数据库的时候却没有转义,而网站程序默认数据库中的数据都是安全的,当网站程序第二次调用刚才存储的脏数据的时候,则不会转义使用而是直接使用,因此就会达到注入的效果。

注意两点:

  • 网站会将数据原封不动的存入数据库中。
  • 网站会直接调用数据库中的数据而不会对其进行检测等操作。(信任数据库中的数据
例子:

某个网站,在处理注册登录的时候,对输入的用户名中的敏感字符执行转义操作,进行完对应的SQL查询后再将数据存入数据库中。比如输入了admin' #,网站则会将'和#转义后进行SQL查询,但是最后存入数据库中的结果仍然是admin' #(并没有转义存储)。

这样一来,由于第一次存在转义的机制,我们无法通过第一次SQL的构造就实现注入,但是此时目标数据库中已经存在了SQL注入的语句,我们只要想办法让网站自己去调用这条数据,那么就会造成二次注入。

假设成功登录后,在修改密码时网站会自动从数据库中提取你的用户名,由于网站默认数据库中的数据都是安全的,因此当提取数据库中的用户名admin' #的时候,并不会进行转义操作,而是直接拼接到SQL语句中执行。

修改密码的sql语句如下:

UPDATE users SET PASSWORD='$pass' WHERE username='$username' and password='$curr_pass' 

当我们修改密码的时候,网站则会直接提取数据库中的admin' #拼接到SQL中执行。

UPDATE users SET PASSWORD='$pass' WHERE username='admin' #' and password='$curr_pass'

那么真正奏效的语句则是

UPDATE users SET PASSWORD='$pass' WHERE username='admin' 

此时我们的用户是admin' #但是却成功的修改了admin账户的密码。这样我们就可以登录admin账户。

本题代码:

登录页面

$username= $_SESSION["username"];
$curr_pass= mysql_real_escape_string($_POST['current_password']);
$pass= mysql_real_escape_string($_POST['password']);
$re_pass= mysql_real_escape_string($_POST['re_password']);

$sql = "UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass' ";

在这里可以看到在登陆的时候网站会接收用户输入的账号和密码,然后调用mysql_real_excape_string()处理。

而mysql_real_excape_string()的作用就是转义字符串中的特殊字符:

  • \x00
  • \n
  • \r
  • \
  • "
  • \x1a

这样我们如果输入一个admin' #那么执行的时候则是select * from users where username ='admin\' #'。转义会将单引号当做内容进行查询而使得闭合作用失效。因此在这个页面我们无法注入。

注册页面

$username=  mysql_escape_string($_POST['username']) ;
$pass= mysql_escape_string($_POST['password']);
$re_pass= mysql_escape_string($_POST['re_password']);

$sql = "insert into users ( username, password) values(\"$username\", \"$pass\")";

在注册这里,首先是利用mysql_escape_string对用户输入的数据进行转义。

这里我们输入一个test' #那么后台获取到的$username就是test\' #,然后同样处理两次输入的密码并核对,最后通过insert将账号和对应的密码插入表中。

而最终的插入SQL的语句则变成了:

insert into users ( username, password) values("test\' #", "123456");

在SQL执行的过程中,单个转义符号是透明的(相当于告诉SQL我后面的单引号是一个插入的值而不是字符串的闭合标志),也就是说最终存储在 数据库中的数据是test' #。这就对应了第一点网站会将数据原封不动的存入数据库中。

综上所述,此页面是存在二次注入漏洞的。我们可以利用这个漏洞构造SQL注入语句然后存储于服务器数据库中。当服务器上的程序二次调用此数据的时候,就可能出现问题。  

修改密码 

$username= $_SESSION["username"];
$curr_pass= mysql_real_escape_string($_POST['current_password']);
$pass= mysql_real_escape_string($_POST['password']);
$re_pass= mysql_real_escape_string($_POST['re_password']);

$sql = "UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass' ";

session中直接获得了当前用户名,且被直接用于更新语句并未做检查。那么获取到的数据就是刚才我们精心制作的“间谍”了。然后直接将这个username拼接到SQL中去执行。我们人工复现一下这个过程。

首先获取$username="test' #",然后执行SQL

$sql = "UPDATE users SET PASSWORD='$pass' where username='test' #' and password='$curr_pass' ";

这样一来,#后面的语句都被注释掉了。那么这条语句改的则是test账户的密码而不是test' #的密码。

这就对应了第二点:网站会直接调用数据库中的数据而不会对其进行检测等操作。

综上所述:我们利用注册界面先将被污染的数据存入数据库中,然后利用登录成功后的修改密码功能二次利用污染数据,造成最终的SQL注入。

本题实操 

现在知道有个用户是Dumb,不知道密码,我要修改它的密码然后登录 

 1.注册 Dumb' # 的账号 ,数据库存入账号

2.去修改Dumb' #的密码  ,sql语句执行的是修改Dumb的密码操作

$sql = "UPDATE users SET PASSWORD='$pass' where username='Dumb' #' and password='$curr_pass' ";

 

成功修改Dumb的密码 ,就可以登录Dumb了 

Less25(过滤了or和and的盲注)

没什么新鲜的

双写绕过就行  注意 information 中的or

本题也比较简单 

Less26(过滤了注释和空格的注入)

空格 代替方式很多用 1、空白符绕过  2、多行注释/**/绕过  3、括号绕过

注释用单引号' 闭合 

and or 双写

Less27(过滤了union和select的)

区分大小写,UNion 和 SElect 就能绕过 当然双写三写也能绕

空格就用%0a ,注释用'  ,这里不能用- ,id用0

Less-28(有括号的单引号字符型,过滤了union和select等的注入)

 是(' 闭合

 不区分大小写,过滤 union select 整体 ,就整体双写

/?id=0')%0aununion%0aselection%0aselect%0a1,2,3%0aand('1')=('1

 

Less-29(HTTP参数污染绕WAF)

内容是关于HTTP参数污染(HTTP Parameter Pollution,简称HPP)的,正好前段时间简单看过,就是如果输入多个同名参数,可能服务器仅取第一个或者最后一个。用在sql注入的WAF绕过上,就是服务器所有同名参数都取了,但是对某些参数做检测,用其他参数做处理。详情可以参考下面这篇

 HTTP参数污染攻击_0xdawn的博客-CSDN博客_http参数污染

 

 

 

 

这关有两个和id相关的变量,一个叫$id1一个叫$id,

函数java_implimentation()生成$id1,whitelist()处理$id1,而sql语句中代入的却是$id 

当传入值id=xxx就生成了$qs,$qs去生成$id1,whitelist处理$id1,只能传入数字。

所以使用传入两个同名的参数$id,第一个满足检查,第二个就能构造sql了 

  Less32(get宽字节注入)

输入?id=1'    发现单引号被自动添加了 转译符 \  

里涉及到 宽字节 注入 的相关知识

在一般情况下,此处是不存在SQL注入漏洞的,不过有一个特例,就是当数据库的编码为GBK时,可以使用宽字节注入,宽字节的格式是在地址后先加一个%df,再加单引号,因为反斜杠的编码为%5c,而在GBK编码中,%df%5c是繁体字“連”,所以这时,单引号成功逃逸,报出MySQL数据库的错误。

 

查表和字段时 不能用 ' '

将数据转为16进制

/?id=-1%df' union select 1,2,group_concat(column_name) from information_schema.columns where table_name=0x7573657273--+

 Less33(宽字节注入)

 与上一题不同的是这里 addslashes()函数 

addslashes() 函数返回在预定义字符之前添加反斜杠的字符串。

预定义字符是:

  • 单引号(')
  • 双引号(")
  • 反斜杠(\)
  • NULL

payload与上题一样,因为只用'就行 

 Less34(post宽字节注入) 

代码与上一题一样,就是get换成post了 

注意不能直接在表单里面注 ,url会自动编码%

hackbar还是有问题的,用burp

Less36(宽字节注入)

mysql_real_escape_string() 

mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符。

下列字符受影响:

  • \x00
  • \n
  • \r
  • \
  • '
  • "
  • \x1a

与Less33一样,直接宽字节带入' 

Less38(堆叠注入)

sqli-labs(38) - hixiaoai - 博客园

原理介绍

  在SQL中,分号(;)是用来表示一条sql语句的结束。试想一下我们在 ; 结束一个sql语句后继续构造下一条语句,会不会一起执行?因此这个想法也就造就了堆叠注入。而union injection(联合注入)也是将两条语句合并在一起,两者之间有什么区别么?区别就在于union 或者union all执行的语句类型是有限的,可以用来执行查询语句,而堆叠注入可以执行的是任意的语句

例子:

/?id=-1' union select 1,2,3;insert into users values(99,'hacker','hacker')--+

 之所以能使用堆叠注入,是因为代码中使用了mysqli_multi_query()函数,该函数可以执行多个针对数据库的查询

 

关注
打赏
1660722558
查看更多评论
立即登录/注册

微信扫码登录

0.0370s